Zend_Db_Table_Definition.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.db.table.row">
  4. <title>Zend_Db_Table_Definition</title>
  5. <sect2 id="zend.db.table.definition.introduction">
  6. <title>Introduction</title>
  7. <para>
  8. <classname>Zend_Db_Table_Definition</classname> est une classe qui peut être utilisée pour
  9. décrire les relations et les options de configuration qui devraient être utilisées lorsque
  10. <classname>Zend_Db_Table</classname> est manipulée par instantiation concrête.
  11. </para>
  12. </sect2>
  13. <sect2 id="zend.db.table.definition.usage">
  14. <title>Utilisation de base</title>
  15. <para>
  16. Les options décrites dans un objet de définition sont les mêmes que celles
  17. qu'utilisent les classes étendant Zend_Db_Table_Asbtract. Votre objet de définition
  18. peut alors être passé à la classe à l'instanciation, celle-ci connaitra alors la
  19. définition de toutes les tables concernées.
  20. </para>
  21. <para>
  22. Voici un exemple d'objet de définition qui va décrire les noms des tables
  23. et les relations entre les objets supports de ces tables.
  24. Note: Si 'name' n'est pas précisé, la clé servira alors de nom à la table, c'est
  25. le cas dans notre exemple avec 'genre'.
  26. </para>
  27. <example id="zend.db.table.definition.example1">
  28. <title>Décrire un modèle de base de données</title>
  29. <programlisting language="php"><![CDATA[
  30. $definition = new Zend_Db_Table_Definition(array(
  31. 'author' => array(
  32. 'name' => 'author',
  33. 'dependentTables' => array('book')
  34. ),
  35. 'book' => array(
  36. 'name' => 'book',
  37. 'referenceMap' => array(
  38. 'author' => array(
  39. 'columns' => 'author_id',
  40. 'refTableClass' => 'author',
  41. 'refColumns' => 'id'
  42. )
  43. )
  44. ),
  45. 'genre' => null,
  46. 'book_to_genre' => array(
  47. 'referenceMap' => array(
  48. 'book' => array(
  49. 'columns' => 'book_id',
  50. 'refTableClass' => 'book',
  51. 'refColumns' => 'id'
  52. ),
  53. 'genre' => array(
  54. 'columns' => 'genre_id',
  55. 'refTableClass' => 'genre',
  56. 'refColumns' => 'id'
  57. )
  58. )
  59. )
  60. ));
  61. ]]></programlisting>
  62. </example>
  63. <para>
  64. Comme vous le voyez, les mêmes options que vous utilisez en général en étendant
  65. Zend_Db_Table_Abstract sont présentes dans ce tableau. Cette définition va
  66. <strong>persister</strong> vers toutes les tables qui seront créees par votre
  67. objet, ceci assure une isolation et un bon fonctionnement.
  68. </para>
  69. <para>
  70. Ci-après un exemple d'instanciation d'une table et de l'utilisation de
  71. findDependentRowset() et findManyToManyRowset() qui vont correspondre au modèle
  72. de données:
  73. </para>
  74. <example id="zend.db.table.definition.example2">
  75. <title>Intéragir avec la définition utilisée</title>
  76. <programlisting language="php"><![CDATA[
  77. $authorTable = new Zend_Db_Table('author', $definition);
  78. $authors = $authorTable->fetchAll();
  79. foreach ($authors as $author) {
  80. echo $author->id . ': ' . $author->first_name . ' ' . $author->last_name . PHP_EOL;
  81. $books = $author->findDependentRowset('book');
  82. foreach ($books as $book) {
  83. echo ' Book: ' . $book->title . PHP_EOL;
  84. $genreOutputArray = array();
  85. foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
  86. $genreOutputArray[] = $genreRow->name;
  87. }
  88. echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
  89. }
  90. }
  91. ]]></programlisting>
  92. </example>
  93. </sect2>
  94. <sect2 id="zend.db.table.definition.advanced-usage">
  95. <title>Utilisation avancée</title>
  96. <para>
  97. Quelques fois vous voudriez mixer les utilisations, via la définition et
  98. une extension concrête de Zend_Db_Table_Abstract. Pour ce faire, omettez
  99. de spécifier une définition concernant la classe concrête.
  100. Zend_Db_Table utiisera alors l'instance que vous lui passerez.
  101. </para>
  102. <para>
  103. Dans l'exemple d'après, nous allons placer une des tables sous forme de classe concrête,
  104. et laisser les autres sous forme de définitions. Nous allons voir alors comment les faire
  105. intéragir.
  106. </para>
  107. <example id="zend.db.table.definition.example3">
  108. <title>Mixer la définition et l'extension concrête</title>
  109. <programlisting language="php"><![CDATA[
  110. class MyBook extends Zend_Db_Table_Abstract
  111. {
  112. protected $_name = 'book';
  113. protected $_referenceMap = array(
  114. 'author' => array(
  115. 'columns' => 'author_id',
  116. 'refTableClass' => 'author',
  117. 'refColumns' => 'id'
  118. )
  119. );
  120. }
  121. $definition = new Zend_Db_Table_Definition(array(
  122. 'author' => array(
  123. 'name' => 'author',
  124. 'dependentTables' => array('MyBook')
  125. ),
  126. 'genre' => null,
  127. 'book_to_genre' => array(
  128. 'referenceMap' => array(
  129. 'book' => array(
  130. 'columns' => 'book_id',
  131. 'refTableClass' => 'MyBook',
  132. 'refColumns' => 'id'
  133. ),
  134. 'genre' => array(
  135. 'columns' => 'genre_id',
  136. 'refTableClass' => 'genre',
  137. 'refColumns' => 'id'
  138. )
  139. )
  140. )
  141. ));
  142. $authorTable = new Zend_Db_Table('author', $definition);
  143. $authors = $authorTable->fetchAll();
  144. foreach ($authors as $author) {
  145. echo $author->id . ': ' . $author->first_name . ' ' . $author->last_name . PHP_EOL;
  146. $books = $author->findDependentRowset(new MyBook());
  147. foreach ($books as $book) {
  148. echo ' Book: ' . $book->title . PHP_EOL;
  149. $genreOutputArray = array();
  150. foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
  151. $genreOutputArray[] = $genreRow->name;
  152. }
  153. echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
  154. }
  155. }
  156. ]]></programlisting>
  157. </example>
  158. </sect2>
  159. </sect1>