我能想到的與子查詢的方式。以下摘錄摘自我正在研究的圖書館。它們被放置在lib/
目錄中,因此自動裝載機可以訪問它們。我還沒有分析性能,但我的直覺告訴我,MySQL會分開緩存子查詢,所以當重用時它們的結果很好而且很快。如果性能不太好,我可能不得不將這些視爲數據庫視圖。
這種技術的關鍵是理解Zend的選擇可以直接用作SELECT,FROM或WHERE子句並自動成爲子查詢。
// A shortened example, not tested directly
class Example_Product_List extends Varien_Db_Select {
protected $_resource;
public function __construct($storeId) {
// Since this isn't a collection we need to get the resource ourselves
$this->_resource = Mage::getSingleton('core/resource');
$adapter = $this->_resource->getConnection('core_read');
parent::__construct($adapter);
$this->from(
array('catprod'=>$this->getTable('catalog/category_product')),
'product_id'
);
$this->joinInner(
array('catprodin'=>$this->getTable('catalog/category_product_index'),
'(catprodin.category_id=catprod.category_id) AND (catprodin.product_id=catprod.product_id)',
'store_id'
);
$this->where('store_id = ?', $storeId);
$this->group('product_id');
}
public function getTable($modelEntity)
{
return $this->_resource->getTableName($modelEntity);
}
}
// Using it in a collection
class Example_Module_Model_Resource_Product_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4 {
protected function setStoreId($store) {
$this->getSelect()->where(array(
'attribute'=>'product_id',
'in'=>new Example_Product_list($store->getId())
);
return parent::setStoreId($store);
}
}
// Putting it to use, '1' can be any store ID.
$_testproductCollection = Mage::getResourceModel('examplemodule/product_collection');
$_testproductCollection->addStoreFilter(1);
$_testproductCollection->addAttributeToSelect('*')->load();
靠近我用的是繼承addStoreFilter()
因爲我想不僅包含了正確的產品,但也使用店內的相應值結束。如果您的商店翻譯了產品名稱,則會採用正確的名稱。
基本上整個事情是構建商店的所有產品列表(相當大,這就是爲什麼我希望它緩存),然後有效地執行「WHERE product_id IN(list_of_product_ids)」。
過濾通過商店無法正常工作(見我的帖子鏈接在原來的問題)。 – 2011-05-16 14:02:02
那麼你只需要在你的問題中定義「正確」,或者你需要在代碼級別或SQL級別中過濾這些內容 – 2011-05-16 14:49:23
我發佈的鏈接全部說明,沒有意義重複一切。基本上我在phtml模板中調用集合,並且我想爲上面的集合調用添加一個商店過濾器,但首先我需要加入這些字段,以便可以訪問每個產品的store_id。 – 2011-05-16 15:22:16