Zend_Db_Table_Definition(日本語)

導入

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

基本的な利用法

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

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

Example #1 データベース・データモデルの定義を記述

  1. $definition = new Zend_Db_Table_Definition(array(
  2.     'author' => array(
  3.         'name' => 'author',
  4.         'dependentTables' => array('book')
  5.         ),
  6.     'book' => array(
  7.         'name' => 'book',
  8.         'referenceMap' => array(
  9.             'author' => array(
  10.                 'columns' => 'author_id',
  11.                 'refTableClass' => 'author',
  12.                 'refColumns' => 'id'
  13.                 )
  14.             )
  15.         ),
  16.     'genre' => null,
  17.     'book_to_genre' => array(
  18.         'referenceMap' => array(
  19.             'book' => array(
  20.                 'columns' => 'book_id',
  21.                 'refTableClass' => 'book',
  22.                 'refColumns' => 'id'
  23.                 ),
  24.             'genre' => array(
  25.                 'columns' => 'genre_id',
  26.                 'refTableClass' => 'genre',
  27.                 'refColumns' => 'id'
  28.                 )
  29.             )
  30.         )
  31.     ));

ご覧の通り、通常、拡張した Zend_Db_Table_Abstract クラスで出会うであろう オプションは、同様にこの配列で文書化されます。 Zend_Db_Table コンストラクタに渡されるとき、 この定義は適切な列を返すために作成する必要がある どんなテーブルにでも残存します

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

Example #2 記述された定義との相互作用

  1. $authorTable = new Zend_Db_Table('author', $definition);
  2. $authors = $authorTable->fetchAll();
  3.  
  4. foreach ($authors as $author) {
  5.     echo $author->id
  6.        . ': '
  7.        . $author->first_name
  8.        . ' '
  9.        . $author->last_name
  10.        . PHP_EOL;
  11.     $books = $author->findDependentRowset('book');
  12.     foreach ($books as $book) {
  13.         echo '    Book: ' . $book->title . PHP_EOL;
  14.         $genreOutputArray = array();
  15.         $genres = $book->findManyToManyRowset('genre', 'book_to_genre');
  16.         foreach ($genres as $genreRow) {
  17.             $genreOutputArray[] = $genreRow->name;
  18.         }
  19.         echo '        Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
  20.     }
  21. }

高度な利用法

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

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

Example #3 Zend_Db_Table定義の混合利用との相互作用

  1. class MyBook extends Zend_Db_Table_Abstract
  2. {
  3.     protected $_name = 'book';
  4.     protected $_referenceMap = array(
  5.         'author' => array(
  6.             'columns' => 'author_id',
  7.             'refTableClass' => 'author',
  8.             'refColumns' => 'id'
  9.             )
  10.         );
  11. }
  12.  
  13. $definition = new Zend_Db_Table_Definition(array(
  14.     'author' => array(
  15.         'name' => 'author',
  16.         'dependentTables' => array('MyBook')
  17.         ),
  18.     'genre' => null,
  19.     'book_to_genre' => array(
  20.         'referenceMap' => array(
  21.             'book' => array(
  22.                 'columns' => 'book_id',
  23.                 'refTableClass' => 'MyBook',
  24.                 'refColumns' => 'id'
  25.                 ),
  26.             'genre' => array(
  27.                 'columns' => 'genre_id',
  28.                 'refTableClass' => 'genre',
  29.                 'refColumns' => 'id'
  30.                 )
  31.             )
  32.         )
  33.     ));
  34.  
  35. $authorTable = new Zend_Db_Table('author', $definition);
  36. $authors = $authorTable->fetchAll();
  37.  
  38. foreach ($authors as $author) {
  39.     echo $author->id
  40.        . ': '
  41.        . $author->first_name
  42.        . ' '
  43.        . $author->last_name
  44.        . PHP_EOL;
  45.     $books = $author->findDependentRowset(new MyBook());
  46.     foreach ($books as $book) {
  47.         echo '    Book: ' . $book->title . PHP_EOL;
  48.         $genreOutputArray = array();
  49.         $genres = $book->findManyToManyRowset('genre', 'book_to_genre');
  50.         foreach ($genres as $genreRow) {
  51.             $genreOutputArray[] = $genreRow->name;
  52.         }
  53.         echo '        Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
  54.     }
  55. }
blog comments powered by Disqus