Jak mogę naprawić „Produkt (Mage_Catalog_Model_Product) o tym samym identyfikatorze” xxx „już istnieje”?


18

Ten błąd pojawia się podczas próby filtrowania kolekcji produktów

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist i chciałem zapytać, co może powodować błąd, ponieważ w Magento jest tylko jeden (widoczny) produkt o tym samym identyfikatorze.

Czy istnieje tabela, którą należy wyczyścić, aby usunąć ten duplikat?


Czy możesz dodać kod? Musisz użyć, group byaby uzyskać tylko unikalny identyfikator produktu. Zobacz magento.stackexchange.com/questions/12773/…
Renon Stewart

@RS, Cześć, wciąż próbuję znaleźć przyczynę, którą wyślę z powrotem, jak tylko
wyśledzę

Odpowiedzi:


36

Dodanie distinctzgodnie z sugestią w zaakceptowanej odpowiedzi rozwiązuje problem, ale ma problemy z wydajnością. Baza danych może tworzyć tabele tymczasowe na dysku podczas wykonywania zapytania, distinctco spowolni twoje żądanie. Zamiast tego możesz dodać groupwarunek do kolekcji, aby usunąć duplikaty.

Spójrz na ten post . To, co zrobili (i ja też to zrobiłem), to pogrupowanie według identyfikatora jednostki. To powinno działać lepiej.

//adding filters to the collection..

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

czy możesz powiedzieć, gdzie musimy dodać ten kod
Baby in Magento

@BabyinMagento, gdziekolwiek jest, używasz swojej kolekcji w swoim niestandardowym kodzie. Ten błąd występuje podczas tworzenia niestandardowych modułów, które pobierają kolekcje z bazy danych. Oznacza to, że może się pojawić, jeśli niedawno zainstalowałeś moduły innych firm. W takim przypadku programista wspomnianego modułu musi znaleźć lokalizację błędu.
Vic

distinct()Rozwiązanie i będzie to usunąć wszelkie dodatkowe rekordy z zapytaniem, co oznacza, może nastąpić utrata danych nie zauważając. Może to nie być najlepsze rozwiązanie, jak w moim przypadku. Teraz próbuję znaleźć sposób na przeniesienie obu rekordów z mojej połączonej tabeli do kolekcji, aby wyświetlić oba rekordy w tym samym wierszu w siatce.
Jacques

Mała uwaga: nie należy łączyć tego z kolekcją, ale najpierw umieść swoją colelction w zmiennej, a następnie wykonaj $ collection-> getSelect () -> group ('e.entity_id');
Rickert

gdzie mogę zaktualizować ten kod?
zus

7

Zwykle jest to błąd w danych lub implementacji kolekcji.

Oto rozwiązanie szerszego problemu. Działa to w przypadku arbitralnego pobierania, nie tylko dla Catalog_Model_Product.

Krok 1. zmodyfikować plik rdzeń lib/Varien/Data/Collection.php, function addItem()ale w przeciwieństwie do tego odpowiedź sugeruje, nie ukrywają ten błąd.

Zamiast tego dodaj dodatkowe informacje o błędzie do zgłoszonego wyjątku:

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

Krok 2. Weź błędne zapytanie ze swojego raportu o błędzie i uruchom go ręcznie. Zobacz, jakie rekordy duplikują klucz kolekcji. Dodaj order by <key field>w razie potrzeby.

Przeanalizuj zapytanie usuwając tabele uczestniczące jeden po drugim i sprawdź, który rekord spowodował duplikację.

Uważam, że ta łatka powinna być rdzeniem.


3

Problem polega na tym, że masz kolekcję (prawdopodobnie z łączeniem lub związkiem), w wyniku której ten sam produkt jest ładowany do kolekcji dwukrotnie.

Możesz zmienić ładowaną kolekcję, dodając odrębną metodę do wybranego obiektu.

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

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

Ale wiąże się to z nieodłącznymi problemami. Użycie odrębnego spowoduje utworzenie tabel tymczasowych na dysku, a nie w pamięci, co wiąże się z karami wydajności.


0

W moim przypadku

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

nie działa używam:

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

Niech też ktoś będzie hejpful

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.