Zend_Db_Table_Definition
Introduction
Zend_Db_Table_Definition est une classe qui peut être
utilisée pour décrire les relations et les options de configuration qui devraient
être utilisées lorsque Zend_Db_Table est manipulée par
instantiation concrête.
Utilisation de base
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.
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'.
Example #1 Décrire un modèle de base de données
$definition = new Zend_Db_Table_Definition (array(
'name' => 'author',
'dependentTables' => array('book')
),
'name' => 'book',
'columns' => 'author_id',
'refTableClass' => 'author',
'refColumns' => 'id'
)
)
),
'genre' => null,
'book_to_genre' => array(
'columns' => 'book_id',
'refTableClass' => 'book',
'refColumns' => 'id'
),
'columns' => 'genre_id',
'refTableClass' => 'genre',
'refColumns' => 'id'
)
)
)
));
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
persister vers toutes les tables qui seront créees par votre
objet, ceci assure une isolation et un bon fonctionnement.
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:
Example #2 Intéragir avec la définition utilisée
$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;
}
}
Utilisation avancée
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.
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.
Example #3 Mixer la définition et l'extension concrête
class MyBook extends Zend_Db_Table_Abstract
{
protected $_name = 'book';
protected $_referenceMap = array(
'columns' => 'author_id',
'refTableClass' => 'author',
'refColumns' => 'id'
)
);
}
$definition = new Zend_Db_Table_Definition (array(
'name' => 'author',
'dependentTables' => array('MyBook')
),
'genre' => null,
'book_to_genre' => array(
'columns' => 'book_id',
'refTableClass' => 'MyBook',
'refColumns' => 'id'
),
'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;
}
}
|
|