Das Beispiel in diesem Artikel beschreibt die Verwendung der Tabellenzuordnung Zend_Db_Table im Zend Framework. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
Einführung:
In RDBMS gibt es verschiedene Beziehungen zwischen Tabellen, Eins-Viele-Korrespondenz, Viele-Viele-Korrespondenz usw.
Das Zend-Framework bietet einige Methoden, die uns die Implementierung dieser Beziehungen erleichtern.
Definieren Sie die Beziehung:
Das Folgende ist die Beziehungsdefinition für das in diesem Artikel verwendete Beispiel:
<?php class Accounts extends Zend_Db_Table_Abstract { protected $_name = 'accounts'; protected $_dependentTables = array('Bugs'); } class class protected protected class protected } Products extends Zend_Db_Table_Abstract { protected $_name = 'products'; protected $_dependentTables = array('BugsProducts'); } Bugs extends Zend_Db_Table_Abstract { protected $_name = 'bugs';$_dependentTables = array('BugsProducts');$_referenceMap = array( 'Reporter' => array( 'columns' => 'reported_by', 'refTableClass' => 'Accounts', 'refColumns' => 'account_name' ), 'Engineer' => array( 'columns' => 'assigned_to', 'refTableClass' => 'Accounts', 'refColumns' => 'account_name' ), 'Verifier' => array( 'columns' => array('verified_by'), 'refTableClass' => 'Accounts', 'refColumns' => array('account_name') ) ); } BugsProducts extends Zend_Db_Table_Abstract { protected $_name = 'bugs_products';$_referenceMap = array( 'Bug' => array( 'columns' => array('bug_id'), 'refTableClass' => 'Bugs', 'refColumns' => array('bug_id') ), 'Product' => array( 'columns' => array('product_id'), 'refTableClass' => 'Products', 'refColumns' => array('product_id') ) );
Wir sehen, dass im Beispiel vier Klassen definiert sind: Konten, Produkte, Bugs, BugsProducts. Darunter sind Konten, Produkte und Bugs drei Entitätstabellen und BugsProducts ist eine Beziehungstabelle.
Lassen Sie uns diese drei Entitäten noch einmal analysieren. Zwischen ihnen besteht eine Eins-zu-Viele-Beziehung, während zwischen Bug und Produkt eine Viele-zu-Viele-Beziehung besteht.
$_dependentTables ist ein mit dem Objekt verknüpfter Objektname. Beachten Sie hier, dass Sie den Objektnamen anstelle des zugehörigen Datenbanknamens schreiben sollten.
Das Array $_referenceMap wird verwendet, um die Beziehung zu anderen Tabellen zu definieren. Hier können Sie die Beziehung zu diesen Tabellen festlegen und festlegen, welche Art von Beziehung besteht. Als Erstes muss der Regelschlüssel festgelegt werden, der im obigen Beispiel „Reporter“, „Ingenieur“ usw. ist. Die Funktion des Regelschlüssels ist eigentlich der Name einer Beziehung und muss nicht mit dem Namen anderer Datenbanktabellennamen oder anderer Objektnamen identisch sein. Nur zur Markierung, wir können die Rolle dieses Regelschlüssels später sehen.
Jede Regel hat die folgenden Definitionen: (Keine besonderen Anweisungen, alle werden mit der „Reporter“-Beziehung wie oben erklärt)
columns=> „report_by“ oben ist das Feld „report_by“ der Tabelle „Bugs“ in der Datenbank. Hier gibt es nur ein Feld, es können aber auch mehrere Felder eingestellt werden.
refTableClass=> wird verwendet, um die Tabelle festzulegen, die mit dieser Tabelle verknüpft ist. Beachten Sie hierbei, dass Sie anstelle des Tabellennamens den Namen des Objekts der Zieltabelle verwenden müssen. Im Beispiel ist es mit dem Objekt „Konto“ verknüpft.
refColumns =>Legen Sie die Felder der Tabelle fest, in denen der Kontakt auftritt. Sie können mehr als eines schreiben. Wenn es sich auf mehrere Felder bezieht, sollte es Spalten entsprechen. Diese Einstellung ist eigentlich optional. Wenn sie leer ist, wird das zugehörige Feld automatisch als Primärschlüssel der zugehörigen Tabelle festgelegt. Im obigen Beispiel wird der Primärschlüssel nicht als zugehöriges Feld verwendet und daher manuell festgelegt.
onDelete=> Optionales Feld, legen Sie die Aktion beim Löschen fest.
onUpdate=> Optionales Feld, legen Sie die Aktion beim Aktualisieren der Tabelle fest.
Das Obige definiert die Beziehung.
Daten aus der zugehörigen Tabelle abrufen:
Wenn wir bereits ein Abfrageergebnis erhalten haben, können wir die folgende Anweisung verwenden, um das Abfrageergebnis der mit diesem Ergebnis verknüpften Tabelle abzurufen:
$row->findDependentRowset($table, [$rule]);
Diese Methode verwendet im Allgemeinen zwei Entitätstabellen, die einer Viele-Viele-Tabelle entsprechen, und eine Beziehungstabelle, die einer Viele-Viele-Tabelle entspricht. Wie werden die Daten aus einer Entitätstabelle und der anderen Entitätstabelle abgerufen? unten beschrieben.
Das erste Feld $table bezieht sich auf den Klassennamen, der der Tabelle entspricht, mit der diese Tabelle verknüpft ist. Das zweite Feld ist optional und ist der gerade erwähnte Regelschlüssel, der der Name der Beziehung ist. Wenn es weggelassen wird, wird standardmäßig die erste Beziehung in der Tabelle verwendet. Das Folgende ist ein Beispiel:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsReportedByUser = $user1234->findDependentRowset('Bugs');
Im Beispiel haben wir zuerst einen Benutzer mit der Nummer 1234 gelesen und dann herausgefunden, welchen Fehler dieser Typ gemeldet hat. Da Zend standardmäßig die erste Zuordnung ist, hier und Der erste Der mit dem Konto verknüpfte Wert ist „Reporter“, daher wird der Reporter-Datensatz entfernt.
Wenn wir andere Datensätze, wie z. B. Engineer, herausnehmen möchten, können wir der folgenden Methode folgen:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsAssignedToUser = $user1234->findDependentRowset('Bugs', 'Engineer');
Zusätzlich zur Verwendung von findDependentRowset können wir auch das verwenden, was als „ „Magische Methode“-Mechanismus. Der Grund, warum es so genannt wird, ist, dass es ein Zaubertrick zu sein scheint. Die Methode findDependentRowset('466dc5544709fe84511a904abed374b4', '2beb20eacf4e4efa7b66c106c6dc0e29') kann also äquivalent zu Folgendem sein:
- $row->find466dc5544709fe84511a904abed374b4()
- $row - >find466dc5544709fe84511a904abed374b4By2beb20eacf4e4efa7b66c106c6dc0e29()
Hinweis: Dieser Mechanismus wurde erstmals in Ruby on Rails gesehen. Die Werte 466dc5544709fe84511a904abed374b4 und 2beb20eacf4e4efa7b66c106c6dc0e29 müssen genau mit dem zugehörigen Klassennamen und Assoziationsnamen (Regelschlüssel) übereinstimmen, bevor sie wirksam werden können. Das Folgende ist ein Beispiel:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); // Use the default reference rule $bugsReportedBy = $user1234->findBugs();// Specify the reference rule $bugsAssignedTo = $user1234->findBugsByEngineer();
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); // Use the default reference rule $reporter = $bug1->findParentAccounts();// Specify the reference rule $engineer = $bug1->findParentAccountsByEngineer();
Erhalten Sie Felder aus der übergeordneten Tabelle:
Wir haben gerade die Methode eingeführt, in einer Eins-Viele-Beziehung jetzt von Eins zu Viele zu wechseln Wir machen es umgekehrt: Einen von vielen zu nehmen bedeutet eigentlich, den entsprechenden Datensatz von einem von vielen zu nehmen.
Ähnlich haben wir diese Aussage:
$row->findParentRow($table, [$rule]);
Ebenso ist $table der Klassenname und der optionale Parameter $rule wird mit dem entsprechenden Regelschlüssel ausgefüllt. Das Folgende ist ein Beispiel:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?' => 'NEW')); $bug1 = $bugsRowset->current(); $reporter = $bug1->findParentRow('Accounts');
Der Unterschied zu den oben genannten besteht darin, dass das, was oben zurückgegeben wird, ein Satz mehrerer Datensätze ist und dass es sich bei dem, was dieses Mal zurückgegeben wird, um einen Datensatz handeln muss. Das folgende Beispiel dient zum Festlegen der Regel:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); $engineer = $bug1->findParentRow('Accounts', 'Engineer');
Füllen Sie einfach die Regel aus. Ebenso verfügt diese Methode über „magische Felder“. findParentRow('466dc5544709fe84511a904abed374b4', '2beb20eacf4e4efa7b66c106c6dc0e29') entspricht:
- $row->findParent466dc5544709fe84511a904abed374b4()
- $row->findParent466dc5544709fe84511a904abed374b4 By< ;Rule>()
Beispiel:
Erhalten Sie die Felder der Viele-zu-Viele-Beziehungstabelle:
上面两个方法讲述了一对多的使用,下面就是多对多了。我们使用如下方法取得多对多关系表的数据:
$row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2]]);
这里参数变成了4个,因为需要增加一个关系表来存储多对多的关系。
$table是与之发生多对多关系的表的类名,$intersectionTable是中间存储关系的关系表的类名。$rule1和$rule2是上面两个数据表的Rule Key。省略Rule Key的例子如下:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts');
下面是该方法的全部参数调用例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts', 'Bug');
这次的“魔术方法”是,对应 findManyToManyRowset('466dc5544709fe84511a904abed374b4', '97f753065e45ecb7b12f397f16a11d32', 'beb088a48936a0c6bbd9bd3b2a614a2c', 'b036790bae3f5db7e75b614ff74a9b53')
- $row->find466dc5544709fe84511a904abed374b4Via97f753065e45ecb7b12f397f16a11d32()
- $row->find466dc5544709fe84511a904abed374b4Via97f753065e45ecb7b12f397f16a11d32Bybeb088a48936a0c6bbd9bd3b2a614a2c()
- $row->find466dc5544709fe84511a904abed374b4Via97f753065e45ecb7b12f397f16a11d32Bybeb088a48936a0c6bbd9bd3b2a614a2cAndb036790bae3f5db7e75b614ff74a9b53()
例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); // Use the default reference rule $products = $bug1234->findProductsViaBugsProducts();// Specify the reference rule $products = $bug1234->findProductsViaBugsProductsByBug();
希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。
更多Zend Framework教程之Zend_Db_Table表关联实例详解相关文章请关注PHP中文网!