打开平面目录产品数据时如何从magento EAV表中选择
我有以下代码用于从Magento选择最畅销的产品:打开平面目录产品数据时如何从magento EAV表中选择,magento,flat,Magento,Flat,我有以下代码用于从Magento选择最畅销的产品: $productCollection = Mage::getResourceModel('reports/product_collection') ->addOrderedQty($startTime, $currentTime) ->addAttributeToSelect('*') ->setStoreId($storeId)
$productCollection = Mage::getResourceModel('reports/product_collection')
->addOrderedQty($startTime, $currentTime)
->addAttributeToSelect('*')
->setStoreId($storeId)
->addStoreFilter($storeId)
->setOrder('ordered_qty', 'desc')
->setPageSize($this->limit());
}
它工作得很好,直到我在后端将“UseFlatCatalogProduct”设置为yes。
有没有办法告诉magento不要使用平板电脑,而是使用EAV?有人能帮我吗。创建一个新的模型类
('mycatalog/product')
,它扩展了原始的产品类,但硬编码使用EAV资源模型和EAV资源集合,然后在查询代码中使用该模型。我一直在从一个独立的php文件运行代码,当我将代码移到管理模块中时,它就停止使用flat_文件并返回到eav
如果你看一下:Mage\u Catalog\u Model\u Resource\u Eav\u Mysql4\u Product\u Collection
有一种方法:
public function isEnabledFlat()
{
if (Mage::app()->getStore()->isAdmin()) {
return false;
}
if (!isset($this->_flatEnabled[$this->getStoreId()])) {
$this->_flatEnabled[$this->getStoreId()] = $this->getFlatHelper()
->isEnabled($this->getStoreId());
}
return $this->_flatEnabled[$this->getStoreId()];
}
您可以修改它以添加一个额外的条件,该条件根据您自己的条件返回false
顺便说一句,Blazo在第一篇文章中提到的报告集合是这个集合的延伸。这是一篇老文章,但我认为有一点没有说明。 1.一旦将平面目录设置为on,则需要通过cron或admin/shell运行indexer,以便填充平面目录表
进一步阐述艾伦的答案:
class Namespace_Module_Model_Category extends Mage_Catalog_Model_Category
{
protected function _construct()
{
$this->_init('catalog/category');
}
}
上面删除了检查flat是否已启用,并且仅初始化目录/类别资源的标准eav verson
然后,当您希望加载您的模型时,确保您获得eav模型,而不考虑wither,平面数据已启用:
$category = Mage::getModel('namespace_module/category')->load($id)
我发现最简单的解决方案是关闭平面表,然后使用->load(true)参数获取magento执行的SQL查询 e、 g 然后重新打开平板,并将此代码替换为:
$resource = Mage::getSingleton('core/resource');
$readConnection = $resource->getConnection('core_read');
$query = "SELECT `e`.*, `at_ig_unifeed_ids`.`value` AS `ig_unifeed_ids` FROM `catalog_category_entity` AS `e` INNER JOIN `catalog_category_entity_varchar` AS `at_ig_unifeed_ids` ON (`at_ig_unifeed_ids`.`entity_id` = `e`.`entity_id`) AND (`at_ig_unifeed_ids`.`attribute_id` = '139') AND (`at_ig_unifeed_ids`.`store_id` = 0) WHERE (`e`.`entity_type_id` = '3') AND ((at_ig_unifeed_ids.value LIKE '%:".$this->getId().":%'))";
$collection = $readConnection->fetchAll($query);
从现在开始,您可能需要更改其他代码,例如替换
$category->getId()
与
$category[“实体id”]
我希望这有点帮助
注意:这是解决IG_Unifeed module magento bug的一个真正的解决方案,该bug在使用平面表格时忽略了类别过滤。
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
以前
Mage::getModel('catalog/product')->getCollection()
它开始从基于eav的系统中获取数据。在过去的几个小时里,我一直在努力弄清楚为什么我的模块可以在一个安装上完美工作,而不能在另一个安装上完美工作。它创建了一个产品集合,并可选地应用了一个类别过滤器。问题是,Mage\u Catalog\u Model\u Resource\u Product addCategoryFilter()依赖于$category->getId()。。。。Id不存在于平面类别模型中,其卓越的想法。。。我将尝试上述方法,看看我能想出什么。像往常一样谢谢艾伦。这对我很有效,我做了$storeId=Mage::app()->getStore()->getStoreId();之前,我可以在之后回到我喜欢的店面。当我找到它时,这已经有2张反对票了,但没有解释为什么。我猜这是因为当你在另一个商店里运行代码时,它会崩溃。只有当另一个存储具有完全相同的属性ID并且没有使用表名前缀时,它才能工作。即使您要解决这些问题,这个解决方案充其量也显得非常脆弱和粗糙。然后,许多这样的黑客解决方案设法进入生产代码。用你自己的智慧来决定它是否适合你的用例。
Mage::getModel('catalog/product')->getCollection()