<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 17110 -->
<sect1 id="zend.db.table.definition">

    <title>Zend_Db_Table_Definition</title>

    <sect2 id="zend.db.table.definition.introduction">

        <title>導入</title>

        <para>
            <classname>Zend_Db_Table_Definition</classname>は、
            具象のインスタンス化を通じて<classname>Zend_Db_Table</classname>を使うときに、
            使う必要のある、
            関連を記述するために利用できるクラスと構成オプションです。
        </para>

    </sect2>

    <sect2 id="zend.db.table.definition.usage">

        <title>基本的な利用法</title>

        <para>
            拡張したZend_Db_Table_Abstractクラスを設定するとき、
            利用できる同様なオプションの全てに対して、
            定義ファイルを記述すると、
            それらのオプションも利用できます。
            上述の定義でテーブル全ての完全な定義を知ることができるように、
            この定義ファイルはインスタンス化の際のクラスに渡すべきです。
        </para>

        <para>
            下記は、テーブル名とテーブル・オブジェクトの関連を記述する定義です。
            注:
            'name' が定義から省略されると、
            定義済みのテーブルのキーとして管理されます。
            （この例は、下記の例の 'genre' 節です。）
        </para>

        <example id="zend.db.table.definition.example1">

            <title>データベース・データモデルの定義を記述</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>
            ご覧の通り、通常、拡張したZend_Db_Table_Abstractクラスで出会うであろう
            オプションは、同様にこの配列で文書化されます。
            Zend_Db_Tableコンストラクタに渡されるとき、
            この定義は適切な列を返すために作成する必要がある
            どんなテーブルにでも<emphasis>残存します</emphasis>。
        </para>

        <para>
            下記は、
            上述のデータモデルと一致するfindDependentRowset()と
            findManyToManyRowset()呼び出しと同様に、
            プライマリ・テーブル・インスタンス化の例です:
        </para>

        <example id="zend.db.table.definition.example2">

            <title>記述された定義との相互作用</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();
        $genres = $book->findManyToManyRowset('genre', 'book_to_genre');
        foreach ($genres as $genreRow) {
            $genreOutputArray[] = $genreRow->name;
        }
        echo '        Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
    }
}
]]></programlisting>

        </example>

    </sect2>

    <sect2 id="zend.db.table.definition.advanced-usage">

        <title>高度な利用法</title>

        <para>
            時々、テーブル・ゲートウェイの定義、
            及び利用の両方のパラダイムを使うことを望みます:
            拡張と具象のインスタンス化の両方によって。
            こうするために、定義外のどんなテーブル構成をも単純に無視してください。
            これで、Zend_Db_Tableが定義キーの代わりに実際の参照されたクラスを探すことができます。
        </para>

        <para>
            上記の例をもとに、
            
            テーブル構成のうちの1つはZend_Db_Table_Abstractを拡張したクラスであることができます。
            その一方で、残りのテーブルは定義の一部として保ちます。
            この新しい定義とどのように相互作用するかも示します。
        </para>

        <example id="zend.db.table.definition.example3">

            <title>Zend_Db_Table定義の混合利用との相互作用</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();
        $genres = $book->findManyToManyRowset('genre', 'book_to_genre');
        foreach ($genres as $genreRow) {
            $genreOutputArray[] = $genreRow->name;
        }
        echo '        Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
    }
}
]]></programlisting>

        </example>

    </sect2>

</sect1>
