Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打开平面目录产品数据时如何从magento EAV表中选择_Magento_Flat - Fatal编程技术网

打开平面目录产品数据时如何从magento EAV表中选择

打开平面目录产品数据时如何从magento EAV表中选择,magento,flat,Magento,Flat,我有以下代码用于从Magento选择最畅销的产品: $productCollection = Mage::getResourceModel('reports/product_collection') ->addOrderedQty($startTime, $currentTime) ->addAttributeToSelect('*') ->setStoreId($storeId)

我有以下代码用于从Magento选择最畅销的产品:

$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()