Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Entwicklungsframework Yii Framework-Tutorial (27) Beispiel für einen datenbankbezogenen Active Record
Wir haben gesehen, wie man Active Record (AR) verwendet, um Daten aus einer einzelnen Datentabelle abzurufen. In diesem Abschnitt erklären wir, wie Sie AR verwenden, um mehrere verwandte Datentabellen zu verbinden und den verbundenen Datensatz abzurufen.
Um relationales AR zu verwenden, empfehlen wir die Definition von Primärschlüssel-Fremdschlüssel-Einschränkungen in den Tabellen, die verknüpft werden müssen. Diese Einschränkungen können dazu beitragen, die Konsistenz und Integrität der zugehörigen Daten sicherzustellen.
In diesem Beispiel wird erläutert, wie Sie Active Record für mehrere verwandte Tabellen verwenden, indem Sie das Datenbank-Query Builder-Beispiel des Yii Framework Development Tutorial (25) ändern.
Bevor wir AR verwenden, um verwandte Abfragen durchzuführen, müssen wir AR darüber informieren, wie eine AR-Klasse mit einer anderen zusammenhängt.
Die Beziehung zwischen zwei AR-Klassen steht in direktem Zusammenhang mit der Beziehung zwischen den durch die AR-Klassen dargestellten Datentabellen. Aus Datenbanksicht gibt es drei Arten von Beziehungen zwischen den Tabellen A und B: Eins-zu-viele (wie tbl_user und tbl_post), Eins-zu-eins (wie tbl_user und tbl_profile) und Viele-zu-eins (wie tbl_user und tbl_profile) viele-zu-viele wie tbl_category und tbl_post). In AR gibt es vier Beziehungen:
BELONGS_TO (gehört zu): Wenn die Beziehung zwischen Tabellen A und B eine Eins-zu-Viele-Beziehung ist, gehört Tabelle B zu Tabelle A (Beispiel: Beitrag gehört dem Benutzer). );
HAS_MANY (es gibt mehrere): Wenn die Beziehung zwischen den Tabellen A und B eins zu viele ist, dann hat A mehrere Bs (z. B. hat der Benutzer mehrere Beiträge);
HAS_ONE (es gibt eines): Dies ist ein Sonderfall von HAS_MANY. A kann höchstens ein B haben (zum Beispiel kann Benutzer höchstens ein Profil haben).
MANY_MANY: Dies entspricht den vielen. Zu-viele-Beziehung in der Datenbank. Da die meisten DBMS Viele-zu-Viele-Beziehungen nicht direkt unterstützen, ist eine Beziehungstabelle erforderlich, um die Viele-zu-Viele-Beziehung in eine Eins-zu-Viele-Beziehung aufzuteilen. In unserer Beispieldatenstruktur wird zu diesem Zweck tbl_post_category verwendet. In AR-Begriffen können wir MANY_MANY als die Kombination von BELONGS_TO und HAS_MANY interpretieren. Beispiel: Beitrag gehört zu vielen (gehört zu vielen) Kategorien, Kategorie hat viele (hat viele) Beiträge.
Die in AR definierte Beziehung muss die Relationen()-Methode in CActiveRecord überschreiben. Diese Methode gibt ein Array von Beziehungskonfigurationen zurück. Jedes Array-Element stellt eine einzelne Beziehung im folgenden Format dar.
Im Query Builder haben wir die folgende SQL-Abfrageanweisung verwendet
SELECT c.FirstName, c.LastName , c.Address,c.Email FROM customer c INNER JOIN employee e ON c.SupportRepId=e.EmployeeId
WHERE e.EmployeeId=4 umfasst zwei Tabellen Employee und Customer, zwischen Employee und Customer eine Eins-zu- Viele Beziehungen bedeuten, dass ein Mitarbeiter für mehrere Kunden verantwortlich sein kann. Die Beziehung zwischen Mitarbeiter und Kunde ist HAS_MANY, und die Beziehung zwischen Kunde und Mitarbeiter ist HAS_ONE. Daher können Mitarbeiter und Kunde wie folgt definiert werden:
//Customer.phpclass Customer extends CActiveRecord{ public static function model($className=__CLASS__){return parent::model($className);} public function tableName(){return 'Customer';} } //Employee.phpclass Employee extends CActiveRecord{ public static function model($className=__CLASS__){return parent::model($className);} public function tableName(){return 'Employee';} public function relations(){return array('customers'=>array(self::HAS_MANY, 'Customer', 'SupportRepId'), );}}
Da in diesem Beispiel nur der Kunde verwendet wird, der der Mitarbeiterabfrage entspricht, wird für die Klasse nur die Beziehungsmethode definiert. Die entsprechenden Tabellen und Fremdschlüssel sind Customer und SupportRepId.
Ändern Sie dann die indexAction-Methode von SiteController:
public function actionIndex(){ $employee=Employee::model()->findByPk(4); $this->render('index', array('model' => $employee->customers, ));}
Die Beziehungsdefinition in der AR-Klasse fügt der Klasse implizit für jede Beziehung ein Attribut hinzu. Nachdem eine Korrelationsabfrage ausgeführt wurde, werden die entsprechenden Eigenschaften mit der zugehörigen AR-Instanz gefüllt. Daher kann der dem Mitarbeiter entsprechende Kundendatensatz von $employee->customers abgefragt werden.
Der einfachste Weg, eine Korrelationsabfrage durchzuführen, besteht darin, die Korrelationseigenschaft in einer AR-Instanz zu lesen. Wenn auf diese Eigenschaft noch nicht zugegriffen wurde, wird eine Join-Abfrage initialisiert, die die beiden Tabellen und Filter mithilfe des Primärschlüssels der aktuellen AR-Instanz verbindet. Die Abfrageergebnisse werden in der Eigenschaft als Instanz der zugehörigen AR-Klasse gespeichert. Dies ist die legendäre Methode des verzögerten Ladens (auch als verzögertes Laden übersetzt). Beispielsweise wird eine verwandte Abfrage nur ausgeführt, wenn zum ersten Mal auf das verwandte Objekt zugegriffen wird.
In diesem Beispiel wird Lazy Loading verwendet, was in manchen Fällen nicht effizient ist. Wenn wir die Autoren von N Beiträgen ermitteln möchten, führt die Verwendung dieses verzögerten Ladens dazu, dass N Join-Abfragen ausgeführt werden. In diesem Fall sollten wir stattdessen Eager Loading verwenden.
Die Eager-Loading-Methode ruft die zugehörige AR-Instanz ab, während sie gleichzeitig die Haupt-AR-Instanz abruft. Dies erfolgt durch die Verwendung der with-Methode bei Verwendung der find- oder findAll-Methoden in AR. Zum Beispiel:
$employee=Post::model()->with ('customers')->findAll();
Ändern Sie abschließend den Code der Ansicht, die die Ergebnisse anzeigt:
$customer){ echo 'First Name:' . $customer->FirstName . ''; echo 'Last Name:' . $customer->LastName . ''; echo 'Address:' . $customer->Address . ''; echo 'Email:' . $customer->Email . ''; echo '----------------------';} ?>
Unterschiedliche Daten behandeln die Groß-/Kleinschreibung von Spaltennamen unterschiedlich, und einige Datenbanken unterscheiden sich Um auf der sicheren Seite zu sein, verwenden Sie für das Kundenattribut die gleiche Groß-/Kleinschreibung wie für die Spaltendefinition.
Dieses Beispiel stellt die grundlegendste Verwendung des zugehörigen Active Record vor. Weitere Funktionen und Eigenschaften finden Sie in der chinesischen Dokumentation von Yii. Wenn Sie außerdem Tools wie CodeSmith verwenden, Wenn Sie automatisch datenbankdefinierten ActiveRecord-Code generieren können, kann dies den manuellen Codierungsaufwand für Programmierer erheblich reduzieren.
Darüber hinaus geht der Komfort bei der Verwendung von Active Record auf Kosten der Leistung. Im Allgemeinen ist die Leistung bei der Verwendung von Active Record um eine Stufe schlechter als bei der Verwendung von DAO zum Lesen und Schreiben von Datenbanken. Die folgende Tabelle ist ein Referenzwert, um 200 Schauspieler und 1000 Filme zu finden.
Das Obige ist der Inhalt des datenbankbezogenen Active Record-Beispiels des PHP-Entwicklungsframeworks Yii Framework (27). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).