TigerZF
🌐Español

27.9. Zend_Db_Table_Definition

27.9.1. Introducción

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.

27.9.2. Uso básico

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;
    }
}

27.9.3. Uso avanzado

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;
    }
}