Zend FrameworkのZend_Db_Tableで商品同士の関連付けを行う。
Zend FrameworkのO/RマッパーでもあるZend_Db_Tableを使ってテーブルの連結を行う。
商品テーブルと関連テーブルを連結して、関連商品を取得するサンプル。
<?php // 商品テーブル class ItemTable extends Zend_Db_Table_Abstract{ protected $_name="item"; protected $_primary ="item_id"; } // 関連づけテーブル class ItemRelationTable extends Zend_Db_Table_Abstract{ protected $_name="item_relation"; protected $_primary ="relation_id"; // 関連テーブル protected $_referenceMap = array( "Item" => array( "columns" => array("from_item_id"), "refTableClass" => "ItemTable", "refColumns" => array("item_id") ), "toItem" => array( "columns" => array("to_item_id"), "refTableClass" => "ItemTable", "refColumns" => array("item_id") ) ); } // 設定ファイルの読み込み $config=new Zend_Config_Ini("configs/db.ini","database"); // DBアダプタ $con=Zend_Db::factory($config); // 商品テーブルからitem_id=1を検索 $itemTable=new ItemTable($con); $row=$itemTable->find(1)->current(); // クエリー実行 $rowset=$row->findManyToManyRowset("ItemTable","ItemRelationTable",null,"toItem"); // 出力 var_dump($rowset); ?>
[順序]
- 商品テーブルと関連テーブルの定義
- 関連テーブルでは$_referenceMapでリレーションの定義を行う。
- 商品テーブルからまずは商品を検索。
- RowオブジェクトからfindManyToManyRowsetで関連商品を取得
- 第一引数に結合対象のテーブル、第二引数に中間テーブル(関連テーブル)、第3引数には元テーブルのルールキー、第4引数には対象テーブルのルールキー。
- この場合はtoItemを取得したいので、第3引数をnullに、第4引数を"toItem"を指定
- 第一引数に結合対象のテーブル、第二引数に中間テーブル(関連テーブル)、第3引数には元テーブルのルールキー、第4引数には対象テーブルのルールキー。
[一連のコードで吐き出されるSQL]
SELECT `cm_item`.* FROM `cm_item` WHERE (((`cm_item`.`item_id` = 1))) DESCRIBE `cm_item` DESCRIBE `cm_item_relation` SELECT `i`.*, `m`.* FROM `cm_item_relation` AS `i` INNER JOIN `cm_item` AS `m` ON `i`.`to_item_id` = `m`.`item_id` WHERE (`i`.`from_item_id` = 1)
- SQLのDESCRIBEはZend_Cacheを使用する事で、アクセスの度に実行されることがなくなる。
- テーブルのメタデータのキャッシュを参照