Zend_Db_Table_Definition es una clase que puede usarse para
describir las relaciones y las opciones de configuración que deben usarse cuando
Zend_Db_Table se usa mediante instanciación concreta.
Todas las opciones disponibles al configurar una clase extendida de
Zend_Db_Table_Abstract también están disponibles
al describir un archivo de definición. Este archivo de definición debe pasarse a la clase en el
momento de la instanciación para que pueda conocer la definición completa de todas las tablas
en dicha definición.
A continuación se muestra una definición que describirá los nombres de las tablas y las relaciones entre los objetos de tabla. Nota: si 'name' se omite en la definición, se tomará como la clave de la tabla definida (un ejemplo de esto está en la sección 'genre' del ejemplo siguiente.)
Ejemplo 27.157. Descripción de la definición de un modelo de datos de base de datos
$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'
)
)
)
));
Como puede ver, las mismas opciones que generalmente se ven dentro de una
clase extendida de Zend_Db_Table_Abstract también están documentadas en este
array. Cuando se pasa al constructor de Zend_Db_Table, esta
definición se persiste en cualquier tabla que necesite
crear para devolver las filas correctas.
A continuación se muestra un ejemplo de la instanciación de la tabla principal, así como
las llamadas a findDependentRowset() y
findManyToManyRowset() que
corresponden al modelo de datos descrito arriba:
Ejemplo 27.158. Interactuando con la definición descrita
$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();
$genres = $book->findManyToManyRowset('genre', 'book_to_genre');
foreach ($genres as $genreRow) {
$genreOutputArray[] = $genreRow->name;
}
echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
}
}
A veces se desea usar ambos paradigmas para definir y usar el
table gateway: tanto por extensión como por instanciación concreta. Para hacerlo,
simplemente omita las configuraciones de tabla de la definición. Esto
permitirá que Zend_Db_Table busque la clase referida real en lugar
de la clave de la definición.
Basándonos en el ejemplo anterior, permitiremos que una de las configuraciones de tabla
sea una clase extendida de Zend_Db_Table_Abstract, manteniendo el
resto de las tablas como parte de la definición. También mostraremos cómo se interactúa
con esta nueva definición.
Ejemplo 27.159. Interactuando con una definición de Zend_Db_Table de uso mixto
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();
$genres = $book->findManyToManyRowset('genre', 'book_to_genre');
foreach ($genres as $genreRow) {
$genreOutputArray[] = $genreRow->name;
}
echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
}
}