|
|
@@ -0,0 +1,206 @@
|
|
|
+<?xml version="1.0" encoding="UTF-8"?>
|
|
|
+<!-- Reviewed: no -->
|
|
|
+<!-- EN-Revision: 16943 -->
|
|
|
+<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();
|
|
|
+ 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>高度な利用法</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();
|
|
|
+ foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
|
|
|
+ $genreOutputArray[] = $genreRow->name;
|
|
|
+ }
|
|
|
+ echo ' Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+]]></programlisting>
|
|
|
+
|
|
|
+ </example>
|
|
|
+
|
|
|
+ </sect2>
|
|
|
+
|
|
|
+</sect1>
|