Programmieren mit Yii2 ActiveRecord

Was Sie erstellen werden

Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an: Einführung in das Yii-Framework, Hier werden die Vorteile von Yii beschrieben und ein Überblick über die im Oktober 2014 veröffentlichten Änderungen von Yii 2.0 gegeben.

In dieser Programmierserie mit Yii2 leite ich die Leser beim Einsatz des Yii2-Frameworks für PHP. In dem heutigen Tutorial werde ich Sie durch Yiis objektrelationales Mapping (ORM) für das Arbeiten mit Datenbanken führen. Es heißt Active Record und ist ein Schlüsselaspekt für das effiziente Programmieren von Datenbankanwendungen in Yii.

Yii bietet verschiedene Möglichkeiten, programmgesteuert mit Ihrer Datenbank zu arbeiten, z. B. direkte Abfragen und einen Query Builder. Die Verwendung von Active Record bietet jedoch eine Reihe von Vorteilen für die objektorientierte Datenbankprogrammierung. Ihre Arbeit wird effizienter, sicherer, arbeitet innerhalb der Modellansicht-Controller-Architektur von Yii und ist portierbar, wenn Sie sich für den Wechsel der Datenbankplattformen entscheiden (z. B. MySQL zu PostgreSQL)..

Folgen Sie mir, während ich die Grundlagen von Active Record in Yii ausführlich erläutere.

Nur zur Erinnerung, ich beteilige mich an den Kommentarthreads unten. Ich bin besonders interessiert, wenn Sie unterschiedliche Ansätze, zusätzliche Ideen haben oder Themen für zukünftige Tutorials vorschlagen möchten. Wenn Sie eine Frage oder ein Thema haben, schreiben Sie bitte unten. Sie können mich auch direkt auf Twitter @reifman erreichen.

Was ist aktiver Datensatz??

Der Modell-View-Controller von Yii ist einer der wichtigsten Vorteile. Active Record bietet eine objektorientierte Lösung für die Arbeit mit Ihren Datenbanken, die eng in Yii-Modelle integriert ist. Laut Wikipedia wurde der allgemeine Begriff "Active Record" von Martin Fowler in seinem 2003 erschienenen Buch genannt Muster der Unternehmensanwendungsarchitektur."

Die Yii-Dokumentation fasst dies kurz zusammen:

Eine Active Record-Klasse ist einer Datenbanktabelle zugeordnet, eine Active Record-Instanz entspricht einer Zeile dieser Tabelle und einer Attribut einer Active Record-Instanz repräsentiert den Wert einer bestimmten Spalte in dieser Zeile. Anstatt rohe SQL-Anweisungen zu schreiben, würden Sie auf Active Record-Attribute zugreifen und Active Record-Methoden aufrufen, um auf die in Datenbanktabellen gespeicherten Daten zuzugreifen und diese zu bearbeiten.

Die Integration der Active Record-Musterung in Yii ist eine große Stärke des Frameworks, aber für die meisten Frameworks wie Ruby on Rails üblich. 

Diese Abstraktion von Modellen zu Datenbanktabellen ermöglicht es dem Rahmen, die Sicherheit überall zu erhöhen, z. SQL-Injection-Abfragen zusammenbrechen.

Die Unterstützung von Active Record von Yii bietet auch Portabilität für eine Reihe von Datenbanken. Sie können die Datenbanken wechseln, ohne dass Sie wahrscheinlich viel Code ändern müssen:

  • MySQL 4.1 oder höher
  • PostgreSQL 7.3 oder höher
  • SQLite 2 und 3
  • Microsoft SQL Server 2008 oder höher
  • CUBRID 9.3 oder höher
  • Orakel
  • Sphinx: via yii \ sphinx \ ActiveRecord, erfordert die yii2-Sphinx Erweiterung
  • ElasticSearch: über yii \ elasticsearch \ ActiveRecord, erfordert die yii2-elasticsearch Erweiterung

Und die folgenden NoSQL-Datenbanken:

  • Redis 2.6.12 oder neuer: über yii \ redis \ ActiveRecord, erfordert die yii2-redis Erweiterung
  • MongoDB 1.3.0 oder höher: über yii \ mongodb \ ActiveRecord wird das benötigt yii2-mongodb Erweiterung

Grundlagen erlernen

In der vorherigen Episode, Wie programmiere ich mit Yii2: Arbeiten mit der Datenbank und dem aktiven Datensatz, habe ich die Erstellung Ihrer Datenbank durchlaufen, wie Yii für jede Sitzung eine Verbindung herstellt, eine Datenbank zur Erstellung von Datenbanktabellen verwendet und Gii (Yi's hilfreicher Code) verwendet Gerüstgenerator) zur Erstellung von Standardmodellcode. Wenn Sie mit einem dieser Themen nicht vertraut sind, überprüfen Sie diese Episode.

In dieser Episode konzentriere ich mich mehr darauf, Active Record in Ihrem Code zu nutzen.

Deklarieren einer aktiven Datensatzklasse in einem Modell

Lassen Sie mich zunächst einen Überblick über die Transformation eines Yii-Modells erhalten, um Active Record zu nutzen. Ich verwende ein Beispielmodell, das ich in der Reihe "Your Your Startup" erstellt habe. Diese Serie führt Sie durch, wie ich in Yii2 mein Startup Meeting Planner aufbaue.

Ich verwende das Beispiel eines einfachen Modells namens Launch, mit dem Homepage-Besucher ihre E-Mail-Adresse angeben können, wenn sie benachrichtigt werden möchten, wenn das Produkt nicht in der Vorschau angezeigt und vollständig freigegeben ist.

Die Verwendung von Active Record mit einem Modell ist ziemlich einfach. Beachten Sie die Klasse Launch erweitert \ yii \ db \ ActiveRecord:

Das ist es.

Abfragen erstellen

Sehen wir uns einige gängige Active Record-Abfragen an. 

Einzelne Aufzeichnungen

Wenn Sie eine Datensatz-ID haben, die häufig aus einem Abfrageparameter eines Controllers stammt, können Sie den gewünschten Datensatz leicht finden:

öffentliche Funktion actionSomething ($ id) $ model = Launch :: findOne ($ id);

Dies ist identisch mit:

$ model = Launch :: find () -> where (['id' => $ id]) -> one ();

Sie können das auch erweitern -> wo Array mit mehr Feldern oder booleschen Bedingungen:

$ model = Launch :: find () -> where (['id' => $ id, 'status' => Launch :: ACTIVE_REQUEST])… // entspricht $ model = Launch :: find () -> where (['id' => $ id) -> andWhere (['status' => Start :: ACTIVE_REQUEST]) -> oderWorth (['status' => Start :: FUTURE_REQUEST])… 

Mehrere Datensätze

Hier ist ein Beispiel für das Finden aller Datensätze, die einem bestimmten Element entsprechen Status sortiert nach $ id:

$ people = Launch :: find () -> where (['status' => Launch :: STATUS_REQUEST]) -> orderBy ('id') -> all ();

Das -> alle (); findet alle Datensätze statt nur eines. Die Variable $ Leute wird als Array von Modellobjekten zurückgegeben. Wenn keine Bedingungen vorliegen, können Sie alternativ mit auf alle Datensätze zugreifen -> findAll ();

Rückgabe eines Arrays

Verwenden indexBy gibt ein Array von Elementen zurück, die durch ihre indiziert sind Ich würde:

$ people = Start :: find () -> indexBy ('id') -> all ();

Alternativ können Sie ein assoziatives Array mit zurückgeben -> asArray ():

$ people = Start :: find () -> asArray () -> all ();

Hinweis: Yiis Dokumentation sagt: "Obwohl diese Methode Speicher spart und die Leistung verbessert, ist sie näher an der unteren DB-Abstraktionsebene und Sie verlieren die meisten Active Record-Funktionen."

Datensätze zählen

Sie können auch nur eine Anzahl aus einer Abfrage:

$ count = Launch :: find () -> where (['status' => Launch :: STATUS_REQUEST]) -> count ();

Ich verwende in Meeting Planner beispielsweise häufig Statistiken, z. Erfahren Sie mehr in unserer Dashboard-Episode:

// $ count_meetings_completed berechnen $ hd-> count_meetings_completed = Besprechung :: find () -> where (['status' => Besprechung :: STATUS_COMPLETED]) -> andWhere ('created_at<'.$since)->Anzahl();; // $ count_meetings_expired berechnen $ hd-> count_meetings_expired = Besprechung :: find () -> where (['status' => Besprechung :: STATUS_EXPIRED]) -> andWhere ('created_at<'.$since)->Anzahl();; // $ count_meetings_planning berechnen $ hd-> count_meetings_planning = Besprechung :: find () -> where ('status<'.Meeting::STATUS_COMPLETED)->andWhere ('created_at<'.$since)->Anzahl();; // $ count_places berechnen $ hd-> count_places = Place :: find () -> where ('created_at>'. $ after) -> andWhere ('created_at<'.$since)->Anzahl();

Zugriff auf die Daten

Nachdem Sie Daten abgefragt haben, z. B. ein einzelnes Modell, ist es einfach, auf die Daten als Modellobjekt zuzugreifen:

$ model = Launch :: findOne ($ id); $ id = $ model-> id; $ email = $ model-> email;

Ich verarbeite Arrays oft auf diese Weise:

$ users = User :: findAll (); foreach ($ Benutzer als $ u) $ id = $ u-> id; $ email = $ u-> email;

Massive Zuordnung

Sie können ein Array auch über ActiveRecord schnell einem Modelldatensatz zuordnen:

$ values ​​= ['name' => 'James', 'email' => '[email protected]',]; $ customer = neuer Kunde (); $ customer-> attributes = $ values; $ customer-> save ();

Dies wird häufig zum Auffüllen von Modelldaten nach einer Formularübergabe verwendet:

if (isset ($ _ POST ['FormName'])) $ model-> Attribute = $ _POST ['FormName']; if ($ model-> save ()) // handle success

Oder du kannst verwenden -> laden () dafür:

if ($ model-> load (Yii :: $ app-> request-> post ()) && $ model-> save ()) …

Der Gii-Gerüst-Codegenerator von Yii eignet sich hervorragend zum Generieren von Modellen mit ActiveRecord, die viel für Sie tun, z. Modelle, Steuerungen, Formulare, Ansichten usw.

Daten speichern

Wie Sie oben sehen können, ist das Speichern von Daten mit Active Record ebenfalls einfach. In diesem Beispiel aus der Yii-Dokumentation wird ein neuer Datensatz erstellt und gespeichert. Anschließend wird ein Datensatz mit der ID geladen und die Aktualisierungen werden gespeichert:

// Eine neue Datenzeile einfügen $ customer = new Customer (); $ customer-> name = 'James'; $ customer-> email = '[email protected]'; $ customer-> save (); // eine vorhandene Datenzeile aktualisieren $ customer = customer :: findOne (123); $ customer-> email = '[email protected]'; $ customer-> save ();

Datensätze löschen

Das Löschen eines Datensatzes ist noch einfacher:

$ u = User :: findOne (99); $ u-> löschen ();

Zähler aktualisieren

Yii bietet auch einfache Zählerinkremente an. Angenommen, ein Benutzer plant ein anderes Meeting und ich verfolge, wie viele in der Benutzertabelle vorhanden sind:

$ u = User :: findOne (99); $ u-> updateCounters (['meeting_count' => 1]); // entspricht // UPDATE 'User' SET 'meeting_count' = 'meeting_count' + 1 WHERE 'id' = 99 

Beziehungen

Das Verbinden von Tabellen über Indizes hinweg ist eine der leistungsfähigsten Funktionen von Active Record. In Meeting Planner kann beispielsweise jede Besprechung 0 oder mehr haben Treffpunkte. Das Meeting.php-Modell definiert dazu eine relationale ActiveQuery:

* @ property MeetingPlace [] $ meetingPlaces / ** * @return \ yii \ db \ ActiveQuery * / public Funktion getMeetingPlaces () return $ this-> hasMany (MeetingPlace :: className (), ['meeting_id' => 'id.) ']); 

Dann kann ich mit dem auf alle Orte eines Meetings zugreifen $ meetingPlaces Eigentum. Unten lade ich eine Besprechung und durchlaufe alle Besprechungen Treffpunkte ganz einfach als wäre es ein integriertes Array von Unterobjekten:

$ mtg = Besprechung :: find () -> where (['id' => $ meeting_id]) -> one (); foreach ($ mtg-> meetingPlaces als $ mp) …

Dies erfordert natürlich das Erstellen eines Fremdschlüssels, wenn Sie die Tabelle bei der Migration erstellen:

$ this-> createTable ('% meeting_place', ['id' => Schema :: TYPE_PK, 'meeting_id' => Schema :: TYPE_INTEGER. 'NOT NULL', 'place_id' => Schema :: TYPE_INTEGER . 'NOT NULL', 'suggest_by' => Schema :: TYPE_BIGINT. 'NOT NULL', 'status' => Schema :: TYPE_SMALLINT. 'NOT NULL DEFAULT 0', 'created_at' => Schema :: TYPE_INTEGER. 'NOT NULL ',' updated_at '=> Schema :: TYPE_INTEGER.' NOT NULL ',], $ tableOptions); $ this-> addForeignKey ('fk_meeting_place_meeting', '% meeting_place', 'meeting_id', '% meeting', 'id', 'CASCADE', 'CASCADE'); 

Was kommt als nächstes

Ich hoffe, dass dies eine einfache Einführung in einige der herausragenden Leistungen von Active Record bietet. Dazu gehören Lebenszyklen, Transaktionen und Sperren, über die ich in der Zukunft schreiben kann. Wenn Sie einen Sprung nach vorne machen möchten, bietet Yii2 zwei großartige Bereiche, in denen Sie in der Dokumentation weitere Informationen erhalten: Yii2 Guide to Active Record und Yii2 Active Record-Funktionsspezifikationen. Dies sind gut geschriebene Einführungen.

Achten Sie auf kommende Tutorials der Programming With Yii2-Serie, während wir uns weiter mit verschiedenen Aspekten des Frameworks beschäftigen. Sie können auch die bereits erwähnte Reihe "Aufbau Ihres Startups mit PHP" ausprobieren.

Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, folgen Sie mir @reifman auf Twitter oder besuchen Sie meine Instructor-Seite. 

ähnliche Links

  • So programmieren Sie mit Yii2: Arbeiten mit der Datenbank und dem aktiven Datensatz (Envato Tuts +)
  • Yii2 Anleitung zum aktiven Datensatz
  • Yii2 Active Record Funktionsspezifikation
  • Aktive Aufzeichnungsmuster (Wikipedia)
  • Yii2 Developer Exchange, meine Website für Yii2-Ressourcen