尝试过滤产品集合时出现此错误
Item (Mage_Catalog_Model_Product) with the same id "6058" already exist
并想问什么可能导致错误,因为Magento中只有一种(可见的)具有相同ID的产品。
是否有需要清除的表才能删除此dupilcate?
尝试过滤产品集合时出现此错误
Item (Mage_Catalog_Model_Product) with the same id "6058" already exist
并想问什么可能导致错误,因为Magento中只有一种(可见的)具有相同ID的产品。
是否有需要清除的表才能删除此dupilcate?
Answers:
distinct
按照接受的答案中的建议添加确实可以解决问题,但存在性能问题。使用进行查询时,数据库可能会在磁盘上创建临时表distinct
,这将减慢您的请求。您可以改为group
向集合中添加条件以删除重复项。
看一下这篇文章。他们所做的(而且我也这样做了)是按实体ID分组的。这应该表现更好。
//adding filters to the collection..
$collection->getSelect()
->group('e.entity_id');
distinct()
解决方案将删除查询中的所有其他记录,这意味着您可能会丢失数据而不会注意到。因此,就我而言,这可能不是最佳解决方案。我现在正试图找到一种方法,将联接表中的两个记录都放入集合中,以便可以将两个记录显示在网格的同一行上。
通常,这是数据或集合实现中的错误。
这是更广泛问题的解决方案。这适用于任意集合,不仅适用于Catalog_Model_Product
。
步骤1.修改核心文件lib/Varien/Data/Collection.php
,function addItem()
但与该答案不同,请不要隐藏错误。
而是,将其他错误信息添加到引发的异常中:
if (isset($this->_items[$itemId])) {
throw new Exception('Item ('.get_class($item).
') with the same id "'.$item->getId().'" already exist' .
'. SQL that caused this: ' . $this->getSelect());
}
步骤2.从错误报告中获取有问题的查询,然后手动运行它。查看哪些记录重复收集键。order by <key field>
根据需要添加。
剖析查询,一张一张地删除参与表,并查看导致重复的记录。
我相信此补丁应该是核心。
您的问题是您有一个集合(可能带有联接或联合),导致同一产品两次加载到该集合中。
您可以通过向select对象添加独特的方法来更改正在加载的集合。
参见http://framework.zend.com/manual/1.12/en/zend.db.select.html
$db->select()
->distinct()
但这带来了固有的问题。使用distinct将导致在磁盘上而不是在内存中创建临时表,这会带来性能损失。
就我而言
->getSelect()->group('e.entity_id');
我无法使用:
->getSelect()->group('main_table.entity_id');
垫子也要变得快乐
group by
即可获得唯一的产品ID。参见magento.stackexchange.com/questions/12773/…–