¿Cómo puedo arreglar "Item (Mage_Catalog_Model_Product) con el mismo id" xxx "ya existe"?

18

Recibí este error al intentar filtrar una colección de productos

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist y quería preguntar qué podría causar el error ya que solo hay un producto (visible) con la misma ID dentro de Magento.

¿Hay alguna tabla que deba borrarse para eliminar este duplicado?

usuario1704524
fuente
¿Puedes agregar algún código? Debe usar group bypara obtener solo una identificación de producto única. Ver magento.stackexchange.com/questions/12773/…
Renon Stewart
@RS, Hola, todavía estoy tratando de encontrar la causa, volveré a publicar tan pronto como lo
rastree

Respuestas:

36

Agregar lo distinctque se sugiere en la respuesta aceptada soluciona el problema, pero tiene problemas de rendimiento. La base de datos puede crear tablas temporales en el disco al ejecutar una consulta con distincty esto ralentizará su solicitud. En su lugar, puede agregar una groupcondición a la colección para eliminar duplicados.

Echa un vistazo a esta publicación . Lo que hicieron (y lo he hecho también) es agrupar por la identificación de la entidad. Esto debería funcionar mejor.

//adding filters to the collection..

$collection->getSelect()
           ->group('e.entity_id');
Vic
fuente
¿puedes decir dónde tenemos que añadir este código
Bebé en Magento
@BabyinMagento donde sea que esté usando su colección en su código personalizado. Este error ocurre al crear módulos personalizados que obtienen colecciones de la base de datos. Esto significa que podría aparecer si ha instalado módulos de terceros recientemente. En ese caso, corresponde al desarrollador de dicho módulo encontrar la ubicación del error.
Vic
La distinct()solución y esto eliminará cualquier registro adicional de la consulta, lo que significa que podría perder datos sin darse cuenta. Entonces, esta podría no ser la mejor solución, como en mi caso. Ahora estoy tratando de encontrar una manera de obtener los dos registros de mi tabla unida en la colección para poder mostrar ambos registros en la misma fila en la cuadrícula.
Jacques
Pequeña nota: es importante no encadenar esto a la colección, pero primero pone su colección a una variable y luego hacer $ collection-> getSelect () -> group ('e.entity_id');
Rickert
¿Dónde puedo actualizar este código?
zus
7

Normalmente, este es un error en los datos o en la implementación de la colección.

Aquí hay una solución a un problema más amplio. Esto funciona en una colección arbitraria, no solo para Catalog_Model_Product.

Paso 1. Modificar el archivo central lib/Varien/Data/Collection.php, function addItem()pero a diferencia de esta respuesta sugiere, no ocultan el error.

En su lugar, agregue información de error adicional a la excepción lanzada:

        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());
        }

Paso 2. Tome la consulta ofensiva de su informe de errores y ejecútela a mano. Vea qué registros duplican la clave de colección. Agregue order by <key field>según sea necesario.

Diseccione la consulta eliminando las tablas participantes una por una, y vea qué registro causó la duplicación.

Creo que este parche debería estar en el núcleo.

Victor Sergienko
fuente
3

Su problema es que tiene una colección (probablemente con una unión o unión) que resulta en que el mismo producto se cargue en la colección dos veces.

Puede modificar la colección que se está cargando agregando un método distinto al objeto seleccionado.

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

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

Pero esto viene con problemas inherentes. El uso de distintivo hará que se creen tablas temporales en el disco, no en la memoria, lo que conlleva penalizaciones de rendimiento.

choco-loo
fuente
0

En mi caso

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

no funciona yo uso:

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

Mat también puede ser útil para alguien

Hassan Ali Shahzad
fuente