Как я могу исправить «Item (Mage_Catalog_Model_Product) с тем же идентификатором» xxx «уже существует»?

18

Я получаю эту ошибку при попытке отфильтровать коллекцию товаров

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist и хотел спросить, что может вызвать ошибку, поскольку внутри Magento есть только один (видимый) продукт с таким же идентификатором.

Есть ли таблица, которую нужно очистить, чтобы удалить этот дубликат?

user1704524
источник
Можете ли вы добавить код? Вы должны использовать, group byчтобы получить только уникальный идентификатор продукта. См. Magento.stackexchange.com/questions/12773/…
Ренон Стюарт
@RS, Привет, я все еще пытаюсь найти причину, которую я опубликую, как только я ее
выследу

Ответы:

36

Добавление distinctпредложенного в принятом ответе решает проблему, но имеет проблемы с производительностью. База данных может создавать временные таблицы на диске при выполнении запроса с помощью, distinctи это замедлит ваш запрос. Вместо этого вы можете добавить groupусловие в коллекцию для удаления дубликатов.

Посмотрите на этот пост . То, что они сделали (и я тоже это сделал), сгруппированы по идентификатору сущности. Это должно работать лучше.

//adding filters to the collection..

$collection->getSelect()
           ->group('e.entity_id');
Vic
источник
Подскажите, пожалуйста, куда нам нужно добавить этот код
Baby in Magento
@BabyinMagento, где бы вы ни находились, вы используете свою коллекцию в своем пользовательском коде. Эта ошибка возникает при создании пользовательских модулей, которые выбирают коллекции из базы данных. Это означает, что он может появиться, если вы недавно установили сторонние модули. В этом случае, разработчик указанного модуля должен найти местоположение ошибки.
Вик
distinct()Решение , и это приведет к удалению каких - либо дополнительные записи из запроса, который означает , что вы могли бы потерять данные не заметив. Так что это может быть не лучшим решением, как в моем случае. Сейчас я пытаюсь найти способ получить обе записи из моей объединенной таблицы в коллекцию, чтобы я мог показать обе записи в одной строке в сетке.
Жак
Небольшое примечание: важно не связывать это с коллекцией, но следует поместить вашу коллекцию в переменную, а затем сделать $ collection-> getSelect () -> group ('e.entity_id');
Риккерт
где я могу обновить этот код?
Zus
7

Обычно это ошибка в данных или в реализации коллекции.

Вот решение более широкой проблемы. Это работает на произвольной коллекции, а не только для 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>мере необходимости.

Рассеките запрос, удаляя участвующие таблицы по одному, и посмотрите, какая запись вызвала дублирование.

Я считаю, что этот патч должен быть в основном.

Виктор Сергиенко
источник
3

Ваша проблема в том, что у вас есть коллекция (вероятно, с объединением или объединением), в результате чего один и тот же продукт загружается в коллекцию дважды.

Вы можете изменить загружаемую коллекцию, добавив отдельный метод к объекту select.

См. Http://framework.zend.com/manual/1.12/en/zend.db.select.html.

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

Но это связано с внутренними проблемами. Использование Different приведет к созданию временных таблиц на диске, а не в памяти, что приводит к снижению производительности.

шоколадно-Лоо
источник
0

В моем случае

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

не работает я использую:

->getSelect()->group('main_table.entity_id');

Мат может быть полезным для кого-то

Хасан Али Шахзад
источник