Zend_Db_Table_Definition.xml 6.9 KB

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