ECサイト運営開発記

PHPフレームワーク Laravelの使い方を中心とした通販サイトの開発日記

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"を指定

[一連のコードで吐き出される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を使用する事で、アクセスの度に実行されることがなくなる。