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


18

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

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

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


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

@RS, Привет, я все еще пытаюсь найти причину, которую я опубликую, как только я ее
выследу

Ответы:


36

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

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

//adding filters to the collection..

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

Подскажите, пожалуйста, куда нам нужно добавить этот код
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');

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.