如何修复具有相同ID“ xxx”的商品(Mage_Catalog_Model_Product)?


18

尝试过滤产品集合时出现此错误

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist 并想问什么可能导致错误,因为Magento中只有一种(可见的)具有相同ID的产品。

是否有需要清除的表才能删除此dupilcate?


您可以添加一些代码吗?您只需要使用group by即可获得唯一的产品ID。参见magento.stackexchange.com/questions/12773/…–
Renon Stewart

@RS,您好,我仍在寻找原因,一旦我找到它,我就会回发...
user1704524 2014年

Answers:


36

distinct按照接受的答案中的建议添加确实可以解决问题,但存在性能问题。使用进行查询时,数据库可能会在磁盘上创建临时表distinct,这将减慢您的请求。您可以改为group向集合中添加条件以删除重复项。

看一下这篇文章。他们所做的(而且我也这样做了)是按实体ID分组的。这应该表现更好。

//adding filters to the collection..

$collection->getSelect()
           ->group('e.entity_id');

可以请你在那里告诉我们需要添加该代码
婴儿在Magento

@BabyinMagento无论您在哪里,都在自定义代码中使用集合。创建从数据库中获取集合的自定义模块时,会发生此错误。这意味着如果您最近安装了第三方模块,它可能会显示。在那种情况下,由所述模块的开发者找到错误的位置。
2016年

distinct()解决方案将删除查询中的所有其他记录,这意味着您可能会丢失数据而不会注意到。因此,就我而言,这可能不是最佳解决方案。我现在正试图找到一种方法,将联接表中的两个记录都放入集合中,以便可以将两个记录显示在网格的同一行上。
雅克(Jacques)

需要注意的是:它的重要性不将其链接到集合,而是最先将其归类到一个变量,而不是$ collection-> getSelect()-> group('e.entity_id');
瑞克特

我在哪里可以更新此代码?
zus

7

通常,这是数据或集合实现中的错误。

这是更广泛问题的解决方案。这适用于任意集合,不仅适用于Catalog_Model_Product

步骤1.修改核心文件lib/Varien/Data/Collection.phpfunction 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>根据需要添加。

剖析查询,一张一张地删除参与表,并查看导致重复的记录。

我相信此补丁应该是核心。


3

您的问题是您有一个集合(可能带有联接或联合),导致同一产品两次加载到该集合中。

您可以通过向select对象添加独特的方法来更改正在加载的集合。

参见http://framework.zend.com/manual/1.12/en/zend.db.select.html

$db->select()
         ->distinct()

但这带来了固有的问题。使用distinct将导致在磁盘上而不是在内存中创建临时表,这会带来性能损失。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.