Zend_Db_Table_Definition.xml 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.db.table.definition">
  5. <title>Zend_Db_Table_Definition</title>
  6. <sect2 id="zend.db.table.definition.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. <classname>Zend_Db_Table_Definition</classname> ist eine Klasse die verwendet werden
  10. kann um Relationen und Optionen der Konfiguration zu beschreiben die verwendet werden
  11. sollten wenn <classname>Zend_Db_Table</classname> über eine konkrete Instanz verwendet
  12. wird.
  13. </para>
  14. </sect2>
  15. <sect2 id="zend.db.table.definition.usage">
  16. <title>Grundsätzliche Verwendung</title>
  17. <para>
  18. Für alle gleichen Optionen die vorhanden sind wenn eine erweiterte
  19. <classname>Zend_Db_Table_Abstract</classname> Klasse konfiguriert wird, sind diese
  20. Optionen auch vorhanden wenn eine Definitionsdatei beschrieben wird. Diese
  21. Definitionsdatei sollte der Klasse zum Zeitpunkt der Instanziierung übergeben werden
  22. damit diese die komplette Definition aller Tabellen in der besagten Definition kennt.
  23. </para>
  24. <para>
  25. Anbei ist eine Definition welche die Tabellennamen und Relationen zwischen den Tabellen
  26. Objekten beschreibt. Beachte: Wenn 'name' von der Definition ausgelassen wird, wird er
  27. als Schlüssel der definierten Tabelle genommen (ein Beispiel hierfür ist die 'genre'
  28. Sektion im Beispiel anbei.)
  29. </para>
  30. <example id="zend.db.table.definition.example1">
  31. <title>Die Definition eines Datenbank Data Modells beschreiben</title>
  32. <programlisting language="php"><![CDATA[
  33. $definition = new Zend_Db_Table_Definition(array(
  34. 'author' => array(
  35. 'name' => 'author',
  36. 'dependentTables' => array('book')
  37. ),
  38. 'book' => array(
  39. 'name' => 'book',
  40. 'referenceMap' => array(
  41. 'author' => array(
  42. 'columns' => 'author_id',
  43. 'refTableClass' => 'author',
  44. 'refColumns' => 'id'
  45. )
  46. )
  47. ),
  48. 'genre' => null,
  49. 'book_to_genre' => array(
  50. 'referenceMap' => array(
  51. 'book' => array(
  52. 'columns' => 'book_id',
  53. 'refTableClass' => 'book',
  54. 'refColumns' => 'id'
  55. ),
  56. 'genre' => array(
  57. 'columns' => 'genre_id',
  58. 'refTableClass' => 'genre',
  59. 'refColumns' => 'id'
  60. )
  61. )
  62. )
  63. ));
  64. ]]></programlisting>
  65. </example>
  66. <para>
  67. Wie man sieht sind die gleichen Optionen die man generell in einer erweiterten
  68. <classname>Zend_Db_Table_Abstract</classname> Klasse sieht auch in diesem Array
  69. dokumentiert. Wenn es in den Constructor von <classname>Zend_Db_Table</classname>
  70. übergeben wird, ist diese Definition <emphasis>persistent</emphasis> in jeder Tabelle
  71. die erstellt werden muß um die richtigen Zeilen zurückzugeben.
  72. </para>
  73. <para>
  74. Anbei ist ein Beispiel der Instanziierung einer primären Tabelle sowie Aufrufe von
  75. <methodname>findDependentRowset()</methodname> und
  76. <methodname>findManyToManyRowset()</methodname> die mit dem oben beschriebenen
  77. Datenmodell korrespondieren:
  78. </para>
  79. <example id="zend.db.table.definition.example2">
  80. <title>Mit der beschriebenen Definition interagieren</title>
  81. <programlisting language="php"><![CDATA[
  82. $authorTable = new Zend_Db_Table('author', $definition);
  83. $authors = $authorTable->fetchAll();
  84. foreach ($authors as $author) {
  85. echo $author->id
  86. . ': '
  87. . $author->first_name
  88. . ' '
  89. . $author->last_name
  90. . PHP_EOL;
  91. $books = $author->findDependentRowset('book');
  92. foreach ($books as $book) {
  93. echo ' Buch: ' . $book->title . PHP_EOL;
  94. $genreOutputArray = array();
  95. $genres = $book->findManyToManyRowset('genre', 'book_to_genre');
  96. foreach ($genres as $genreRow) {
  97. $genreOutputArray[] = $genreRow->name;
  98. }
  99. echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
  100. }
  101. }
  102. ]]></programlisting>
  103. </example>
  104. </sect2>
  105. <sect2 id="zend.db.table.definition.advanced-usage">
  106. <title>Fortgeschrittene Verwendung</title>
  107. <para>
  108. Manchmal will man beide Paradigmen für die Definition und Verwendung des
  109. Tabellen Gateways verwenden: Beide durch Wrweiterung und konkrete Instanziierung.
  110. Um das zu tun muß man einfach alle Tabellen Konfigurationen aus der Definition
  111. lassen. Das erlaubt es <classname>Zend_Db_Table</classname> in der aktuell referierten
  112. Klasse statt im Definitionsschlüssel nachzusehen.
  113. </para>
  114. <para>
  115. Aufbauend auf dem Beispiel anbei, erlauben wir es einer der Tabellenkonfigurationen
  116. eine erweiterte <classname>Zend_Db_Table_Abstract</classname> Klasse zu sein, während der
  117. Rest der Tabellen Teil der Definition ist. Wir zeigen auch wie man mit dieser neuen
  118. Definition interagieren kann.
  119. </para>
  120. <example id="zend.db.table.definition.example3">
  121. <title>Mit einer gemischten Zend_Db_Table Definition interagieren</title>
  122. <programlisting language="php"><![CDATA[
  123. class MyBook extends Zend_Db_Table_Abstract
  124. {
  125. protected $_name = 'book';
  126. protected $_referenceMap = array(
  127. 'author' => array(
  128. 'columns' => 'author_id',
  129. 'refTableClass' => 'author',
  130. 'refColumns' => 'id'
  131. )
  132. );
  133. }
  134. $definition = new Zend_Db_Table_Definition(array(
  135. 'author' => array(
  136. 'name' => 'author',
  137. 'dependentTables' => array('MyBook')
  138. ),
  139. 'genre' => null,
  140. 'book_to_genre' => array(
  141. 'referenceMap' => array(
  142. 'book' => array(
  143. 'columns' => 'book_id',
  144. 'refTableClass' => 'MyBook',
  145. 'refColumns' => 'id'
  146. ),
  147. 'genre' => array(
  148. 'columns' => 'genre_id',
  149. 'refTableClass' => 'genre',
  150. 'refColumns' => 'id'
  151. )
  152. )
  153. )
  154. ));
  155. $authorTable = new Zend_Db_Table('author', $definition);
  156. $authors = $authorTable->fetchAll();
  157. foreach ($authors as $author) {
  158. echo $author->id
  159. . ': '
  160. . $author->first_name
  161. . ' '
  162. . $author->last_name
  163. . PHP_EOL;
  164. $books = $author->findDependentRowset(new MyBook());
  165. foreach ($books as $book) {
  166. echo ' Buch: ' . $book->title . PHP_EOL;
  167. $genreOutputArray = array();
  168. $genres = $book->findManyToManyRowset('genre', 'book_to_genre');
  169. foreach ($genres as $genreRow) {
  170. $genreOutputArray[] = $genreRow->name;
  171. }
  172. echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
  173. }
  174. }
  175. ]]></programlisting>
  176. </example>
  177. </sect2>
  178. </sect1>