Come posso risolvere "Item (Mage_Catalog_Model_Product) con lo stesso ID" xxx "già esistente"?


18

Ho riscontrato questo errore durante il tentativo di filtrare una raccolta di prodotti

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist e volevo chiedere cosa non potrebbe causare l'errore, poiché all'interno di Magento esiste un solo prodotto (visibile) con lo stesso ID.

Esiste una tabella che deve essere cancellata per rimuovere questo duplicato?


Puoi aggiungere del codice? È necessario utilizzare group byper ottenere solo un ID prodotto unico. Vedi magento.stackexchange.com/questions/12773/…
Renon Stewart,

@RS, Ciao, sto ancora cercando di trovare la causa che
posterò

Risposte:


36

L'aggiunta di distinctcome suggerito nella risposta accettata risolve il problema ma presenta problemi di prestazioni. Il database potrebbe creare tabelle temporanee su disco durante l'esecuzione di una query distincte ciò rallenterà la richiesta. Puoi invece aggiungere una groupcondizione alla raccolta per rimuovere i duplicati.

Dai un'occhiata a questo post . Quello che hanno fatto (e l'ho fatto anche io) è raggruppare per l'entità id. Questo dovrebbe funzionare meglio.

//adding filters to the collection..

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

puoi per favore dire dove dobbiamo aggiungere questo codice
Baby in Magento,

@BabyinMagento ovunque tu stia utilizzando la tua raccolta nel tuo codice personalizzato. Questo errore si verifica durante la creazione di moduli personalizzati che recuperano raccolte dal database. Ciò significa che potrebbe essere visualizzato se hai installato moduli di terze parti di recente. In tal caso, spetta allo sviluppatore di detto modulo trovare la posizione dell'errore.
Vic

La distinct()soluzione e questo rimuoverà qualsiasi record aggiuntivo dalla query, il che significa che potresti perdere dati senza accorgertene. Quindi questa potrebbe non essere la soluzione migliore, come nel mio caso. Ora sto cercando di trovare un modo per ottenere entrambi i record dalla mia tabella unita nella raccolta in modo da poter mostrare entrambi i record sulla stessa riga nella griglia.
Jacques,

Piccola nota: è importante non incatenarlo alla collezione, ma in più mettere la tua collezione in una variabile e fare $ collection-> getSelect () -> group ('e.entity_id');
Rickert

dove posso aggiornare questo codice?
zus,

7

Normalmente, si tratta di un bug nei dati o nell'implementazione della raccolta.

Ecco una soluzione a un problema più ampio. Funziona con una raccolta arbitraria, non solo per Catalog_Model_Product.

Fase 1. Modificare il file core lib/Varien/Data/Collection.php, function addItem()ma a differenza di questa risposta suggerisce, non nascondere l'errore.

Invece, aggiungi ulteriori informazioni sull'errore all'eccezione generata:

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

Passaggio 2. Prendere la query offensiva dalla segnalazione degli errori ed eseguirla manualmente. Scopri quali record duplicano la chiave di raccolta. Aggiungi order by <key field>se necessario.

Analizzare la query rimuovendo le tabelle partecipanti una per una e vedere quale record ha causato la duplicazione.

Credo che questa patch dovrebbe essere al centro.


3

Il tuo problema è che hai una raccolta (probabilmente con un'unione o unione) che sta causando il caricamento dello stesso prodotto nella raccolta due volte.

È possibile modificare la raccolta caricata aggiungendo un metodo distinto all'oggetto select.

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

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

Ma questo comporta problemi intrinseci. L'uso di distinti comporterà la creazione di tabelle temporanee sul disco, non in memoria, che comporta penali di prestazioni.


0

Nel mio caso

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

non funziona uso:

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

Mat può essere sincero anche per qualcuno

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.