| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.db.table.definition">
- <title>Zend_Db_Table_Definition</title>
- <sect2 id="zend.db.table.definition.introduction">
- <title>Introduction</title>
- <para>
- <classname>Zend_Db_Table_Definition</classname> est une classe qui peut être
- utilisée pour décrire les relations et les options de configuration qui devraient
- être utilisées lorsque <classname>Zend_Db_Table</classname> est manipulée par
- instantiation concrête.
- </para>
- </sect2>
- <sect2 id="zend.db.table.definition.usage">
- <title>Utilisation de base</title>
- <para>
- Les options décrites dans un objet de définition sont les mêmes que celles
- qu'utilisent les classes étendant Zend_Db_Table_Abstract. Votre objet de définition
- peut alors être passé à la classe à l'instanciation, celle-ci connaitra alors la
- définition de toutes les tables concernées.
- </para>
- <para>
- Voici un exemple d'objet de définition qui va décrire les noms des tables
- et les relations entre les objets supports de ces tables.
- Note: Si 'name' n'est pas précisé, la clé servira alors de nom à la table,
- c'est le cas dans notre exemple avec 'genre'.
- </para>
- <example id="zend.db.table.definition.example1">
- <title>Décrire un modèle de base de données</title>
- <programlisting language="php"><![CDATA[
- $definition = new Zend_Db_Table_Definition(array(
- 'author' => array(
- 'name' => 'author',
- 'dependentTables' => array('book')
- ),
- 'book' => array(
- 'name' => 'book',
- 'referenceMap' => array(
- 'author' => array(
- 'columns' => 'author_id',
- 'refTableClass' => 'author',
- 'refColumns' => 'id'
- )
- )
- ),
- 'genre' => null,
- 'book_to_genre' => array(
- 'referenceMap' => array(
- 'book' => array(
- 'columns' => 'book_id',
- 'refTableClass' => 'book',
- 'refColumns' => 'id'
- ),
- 'genre' => array(
- 'columns' => 'genre_id',
- 'refTableClass' => 'genre',
- 'refColumns' => 'id'
- )
- )
- )
- ));
- ]]></programlisting>
- </example>
- <para>
- Comme vous le voyez, les mêmes options que vous utilisez en général en étendant
- Zend_Db_Table_Abstract sont présentes dans ce tableau. Cette définition va
- <emphasis>persister</emphasis> vers toutes les tables qui seront créees par votre
- objet, ceci assure une isolation et un bon fonctionnement.
- </para>
- <para>
- Ci-après un exemple d'instanciation d'une table et de l'utilisation de
- findDependentRowset() et findManyToManyRowset() qui vont correspondre au modèle
- de données:
- </para>
- <example id="zend.db.table.definition.example2">
- <title>Intéragir avec la définition utilisée</title>
- <programlisting language="php"><![CDATA[
- $authorTable = new Zend_Db_Table('author', $definition);
- $authors = $authorTable->fetchAll();
- foreach ($authors as $author) {
- echo $author->id . ': ' . $author->first_name . ' ' . $author->last_name . PHP_EOL;
- $books = $author->findDependentRowset('book');
- foreach ($books as $book) {
- echo ' Book: ' . $book->title . PHP_EOL;
- $genreOutputArray = array();
- foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
- $genreOutputArray[] = $genreRow->name;
- }
- echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
- }
- }
- ]]></programlisting>
- </example>
- </sect2>
- <sect2 id="zend.db.table.definition.advanced-usage">
- <title>Utilisation avancée</title>
- <para>
- Quelques fois vous voudriez mixer les utilisations, via la définition et
- une extension concrête de Zend_Db_Table_Abstract. Pour ce faire, omettez
- de spécifier une définition concernant la classe concrête.
- Zend_Db_Table utiisera alors l'instance que vous lui passerez.
- </para>
- <para>
- Dans l'exemple d'après, nous allons placer une des tables sous forme de classe
- concrête, et laisser les autres sous forme de définitions. Nous allons voir
- alors comment les faire intéragir.
- </para>
- <example id="zend.db.table.definition.example3">
- <title>Mixer la définition et l'extension concrête</title>
- <programlisting language="php"><![CDATA[
- class MyBook extends Zend_Db_Table_Abstract
- {
- protected $_name = 'book';
- protected $_referenceMap = array(
- 'author' => array(
- 'columns' => 'author_id',
- 'refTableClass' => 'author',
- 'refColumns' => 'id'
- )
- );
- }
- $definition = new Zend_Db_Table_Definition(array(
- 'author' => array(
- 'name' => 'author',
- 'dependentTables' => array('MyBook')
- ),
- 'genre' => null,
- 'book_to_genre' => array(
- 'referenceMap' => array(
- 'book' => array(
- 'columns' => 'book_id',
- 'refTableClass' => 'MyBook',
- 'refColumns' => 'id'
- ),
- 'genre' => array(
- 'columns' => 'genre_id',
- 'refTableClass' => 'genre',
- 'refColumns' => 'id'
- )
- )
- )
- ));
- $authorTable = new Zend_Db_Table('author', $definition);
- $authors = $authorTable->fetchAll();
- foreach ($authors as $author) {
- echo $author->id . ': ' . $author->first_name . ' ' . $author->last_name . PHP_EOL;
- $books = $author->findDependentRowset(new MyBook());
- foreach ($books as $book) {
- echo ' Book: ' . $book->title . PHP_EOL;
- $genreOutputArray = array();
- foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
- $genreOutputArray[] = $genreRow->name;
- }
- echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
- }
- }
- ]]></programlisting>
- </example>
- </sect2>
- </sect1>
|