Zend_Db_Table_Definition.xml 6.3 KB

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