Heim > php教程 > PHP开发 > Detaillierte Erläuterung der Beispiele für Zend_Db_Table-Tabellenzuordnungen im Zend Framework-Tutorial

Detaillierte Erläuterung der Beispiele für Zend_Db_Table-Tabellenzuordnungen im Zend Framework-Tutorial

高洛峰
Freigeben: 2017-01-05 09:40:45
Original
1146 Leute haben es durchsucht

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      = &#39;accounts&#39;;
  protected $_dependentTables = array(&#39;Bugs&#39;);
}
class
class
  protected
  protected
class
  protected
}
Products extends Zend_Db_Table_Abstract
{
  protected $_name      = &#39;products&#39;;
  protected $_dependentTables = array(&#39;BugsProducts&#39;);
}
Bugs extends Zend_Db_Table_Abstract
{
  protected $_name      = &#39;bugs&#39;;$_dependentTables = array(&#39;BugsProducts&#39;);$_referenceMap  = array(
    &#39;Reporter&#39; => array(
      &#39;columns&#39;      => &#39;reported_by&#39;,
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => &#39;account_name&#39;
    ),
    &#39;Engineer&#39; => array(
      &#39;columns&#39;      => &#39;assigned_to&#39;,
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => &#39;account_name&#39;
    ),
    &#39;Verifier&#39; => array(
      &#39;columns&#39;      => array(&#39;verified_by&#39;),
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => array(&#39;account_name&#39;)
    )
  );
}
BugsProducts extends Zend_Db_Table_Abstract
{
  protected $_name = &#39;bugs_products&#39;;$_referenceMap  = array(
    &#39;Bug&#39; => array(
      &#39;columns&#39;      => array(&#39;bug_id&#39;),
      &#39;refTableClass&#39;   => &#39;Bugs&#39;,
      &#39;refColumns&#39;    => array(&#39;bug_id&#39;)
    ),
    &#39;Product&#39; => array(
      &#39;columns&#39;      => array(&#39;product_id&#39;),
      &#39;refTableClass&#39;   => &#39;Products&#39;,
      &#39;refColumns&#39;    => array(&#39;product_id&#39;)
    )
  );
Nach dem Login kopieren

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]);
Nach dem Login kopieren

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(&#39;Bugs&#39;);
Nach dem Login kopieren

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(&#39;Bugs&#39;, &#39;Engineer&#39;);
Nach dem Login kopieren

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('', '') kann also äquivalent zu Folgendem sein:

- $row->find()
- $row - >findBy()

Hinweis: Dieser Mechanismus wurde erstmals in Ruby on Rails gesehen. Die Werte und 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();
Nach dem Login kopieren
<?php
$bugsTable     = new Bugs();
$bugsRowset    = $bugsTable->fetchAll(&#39;bug_status = ?&#39;, &#39;NEW&#39;);
$bug1       = $bugsRowset->current();
// Use the default reference rule
$reporter     = $bug1->findParentAccounts();// Specify the reference rule
$engineer     = $bug1->findParentAccountsByEngineer();
Nach dem Login kopieren

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]);
Nach dem Login kopieren

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(&#39;bug_status = ?&#39; => &#39;NEW&#39;));
$bug1       = $bugsRowset->current();
$reporter     = $bug1->findParentRow(&#39;Accounts&#39;);
Nach dem Login kopieren

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(&#39;bug_status = ?&#39;, &#39;NEW&#39;);
$bug1       = $bugsRowset->current();
$engineer     = $bug1->findParentRow(&#39;Accounts&#39;, &#39;Engineer&#39;);
Nach dem Login kopieren

Füllen Sie einfach die Regel aus. Ebenso verfügt diese Methode über „magische Felder“. findParentRow('', '') entspricht:

- $row->findParent()
- $row->findParent By< ;Rule>()

Beispiel:

Erhalten Sie die Felder der Viele-zu-Viele-Beziehungstabelle:

上面两个方法讲述了一对多的使用,下面就是多对多了。我们使用如下方法取得多对多关系表的数据:

$row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2]]);
Nach dem Login kopieren

这里参数变成了4个,因为需要增加一个关系表来存储多对多的关系。

$table是与之发生多对多关系的表的类名,$intersectionTable是中间存储关系的关系表的类名。$rule1和$rule2是上面两个数据表的Rule Key。省略Rule Key的例子如下:

<?php
$bugsTable    = new Bugs();
$bugsRowset    = $bugsTable->find(1234);
$bug1234     = $bugsRowset->current();
$productsRowset  = $bug1234->findManyToManyRowset(&#39;Products&#39;, &#39;BugsProducts&#39;);
Nach dem Login kopieren

下面是该方法的全部参数调用例子:

<?php
$bugsTable    = new Bugs();
$bugsRowset    = $bugsTable->find(1234);
$bug1234     = $bugsRowset->current();
$productsRowset  = $bug1234->findManyToManyRowset(&#39;Products&#39;, &#39;BugsProducts&#39;, &#39;Bug&#39;);
Nach dem Login kopieren

这次的“魔术方法”是,对应 findManyToManyRowset('', '', '', '')
- $row->findVia()
- $row->findViaBy()
- $row->findViaByAnd()

例子:

<?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();
Nach dem Login kopieren

希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。

更多Zend Framework教程之Zend_Db_Table表关联实例详解相关文章请关注PHP中文网!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage