Wie kann ich "Item (Mage_Catalog_Model_Product) mit der gleichen ID" xxx "already exist" reparieren?


18

Ich habe diesen Fehler beim Filtern einer Produktsammlung erhalten

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist und wollte fragen was den fehler verursachen könnte da es nur ein (sichtbares) produkt mit der gleichen id in magento gibt.

Gibt es eine Tabelle, die gelöscht werden muss, um dieses Dupilcat zu entfernen?


Können Sie Code hinzufügen? Sie müssen verwenden group by, um nur die eindeutige Produkt-ID zu erhalten. Siehe magento.stackexchange.com/questions/12773/…
Renon Stewart,

@RS, Hallo, ich versuche immer noch, die Ursache zu finden, die ich zurückschicke, sobald ich sie aufspüre ...
user1704524

Antworten:


36

Das Hinzufügen der distinctin der akzeptierten Antwort vorgeschlagenen Option behebt das Problem, es treten jedoch Leistungsprobleme auf. Die Datenbank erstellt möglicherweise temporäre Tabellen auf der Festplatte, wenn eine Abfrage mit ausgeführt wird, distinctund dies verlangsamt Ihre Anforderung. Sie können stattdessen groupder Sammlung eine Bedingung hinzufügen , um Duplikate zu entfernen.

Schauen Sie sich diesen Beitrag an . Was sie getan haben (und ich habe es auch getan), ist eine Gruppierung nach der Entitäts-ID. Dies sollte eine bessere Leistung bringen.

//adding filters to the collection..

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

Können Sie bitte sagen, wo wir diesen Code hinzufügen müssen
Baby in Magento

@BabyinMagento, wo immer Sie Ihre Sammlung in Ihrem benutzerdefinierten Code verwenden. Dieser Fehler tritt auf, wenn benutzerdefinierte Module erstellt werden, die Sammlungen aus der Datenbank abrufen. Dies bedeutet, dass es angezeigt werden kann, wenn Sie kürzlich Module von Drittanbietern installiert haben. In diesem Fall muss der Entwickler des Moduls den Ort des Fehlers ermitteln.
Vic

Die distinct()Lösung und dies werden alle zusätzlichen Datensätze aus der Abfrage entfernen, was bedeutet, dass Sie möglicherweise Daten verlieren, ohne es zu bemerken. Dies ist also möglicherweise nicht die beste Lösung, wie in meinem Fall. Ich versuche jetzt, eine Möglichkeit zu finden, beide Datensätze aus meiner verknüpften Tabelle in die Auflistung zu übernehmen, damit ich beide Datensätze in derselben Zeile im Raster anzeigen kann.
Jacques

Kleine Anmerkung: Es ist wichtig, dies nicht mit der Sammlung zu verketten, sondern Ihre Sammlung zunächst auf eine Variable zu setzen und dann $ collection-> getSelect () -> group ('e.entity_id') auszuführen.
Rickert

Wo kann ich diesen Code aktualisieren?
zus

7

Normalerweise ist dies ein Fehler in den Daten oder in der Auflistungsimplementierung.

Hier ist eine Lösung für ein breiteres Problem. Dies funktioniert auf beliebige Sammlung, nicht nur für Catalog_Model_Product.

Schritt 1. Ändern der Core - Datei lib/Varien/Data/Collection.php, function addItem()aber im Gegensatz zu dieser Antwort schon sagt, nicht verbergen , den Fehler.

Fügen Sie stattdessen der ausgelösten Ausnahme zusätzliche Fehlerinformationen hinzu:

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

Schritt 2. Nehmen Sie die fehlerhafte Abfrage aus Ihrem Fehlerbericht und führen Sie sie manuell aus. Sehen Sie, welche Datensätze den Sammlungsschlüssel duplizieren. Nach order by <key field>Bedarf hinzufügen.

Zerlegen Sie die Abfrage und entfernen Sie die beteiligten Tabellen nacheinander, um festzustellen, welcher Datensatz die Duplizierung verursacht hat.

Ich glaube, dieser Patch sollte im Kern sein.


3

Ihr Problem ist, dass Sie über eine Sammlung verfügen (wahrscheinlich mit einem Join oder einer Union), die dazu führt, dass dasselbe Produkt zweimal in die Sammlung geladen wird.

Sie können die zu ladende Sammlung ändern, indem Sie dem ausgewählten Objekt eine eigene Methode hinzufügen.

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

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

Dies ist jedoch mit Problemen verbunden. Die Verwendung von distinct führt dazu, dass temporäre Tabellen auf der Festplatte erstellt werden und nicht im Arbeitsspeicher, was mit Leistungseinbußen verbunden ist.


0

In meinem Fall

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

funktioniert nicht ich benutze:

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

Vielleicht ist er auch für jemanden hilfreich

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.