“Aynı kimliğe sahip“ Item (Mage_Catalog_Model_Product) ”xxx“ zaten var ”ı nasıl düzeltebilirim?


18

Bir ürün koleksiyonunu filtrelemeye çalışırken bu hatayı alıyorum

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist ve Magento içinde aynı kimliğe sahip tek bir (görünür) ürün olduğundan hataya neyin neden olabileceğini sormak istedim.

Bu ikilemi kaldırmak için temizlenmesi gereken bir tablo var mı?


Biraz kod ekleyebilir misiniz? group byYalnızca benzersiz ürün kimliği almak için kullanmanız gerekir . Bkz. Magento.stackexchange.com/questions/12773/…
Renon Stewart

@RS, Merhaba, hala takip ettiğimde geri göndereceğim sebebini bulmaya çalışıyorum ...
user1704524

Yanıtlar:


36

distinctKabul edilen yanıta önerildiği gibi eklenmesi sorunu çözer ancak performans sorunları vardır. Veritabanı, bir sorgu yürütülürken disk üzerinde geçici tablolar oluşturabilir distinctve bu, isteğinizi yavaşlatır. Bunun yerine group, kopyaları kaldırmak için koleksiyona bir koşul ekleyebilirsiniz .

Bir göz atın bu yazı . Yaptıkları (ve ben de yaptım) varlık kimliğine göre gruptur. Bu daha iyi performans göstermelidir.

//adding filters to the collection..

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

Lütfen bu kodu nereye eklememiz gerektiğini söyleyebilir misiniz
Magento'daki bebek

@BabyinMagento, nerede olursanız olun koleksiyonunuzu özel kodunuzda kullanır. Bu hata, koleksiyonları veritabanından alan özel modüller oluştururken oluşur. Bu, yakın zamanda üçüncü taraf modüller yüklediyseniz görünebileceği anlamına gelir. Bu durumda, hatanın yerini bulmak söz konusu modülün geliştiricisine bağlıdır.
Vic

distinct()Solüsyon ve bu fark olmadan veri kaybedebilirsiniz vasıta sorgusunda, herhangi bir ek kayıtları kaldıracaktır. Yani bu benim durumumda olduğu gibi en iyi çözüm olmayabilir. Şimdi her iki kayıtları ızgarada aynı satırda gösterebilmeniz için birleştirilmiş tablo benim koleksiyon koleksiyonuna almak için bir yol bulmaya çalışıyorum.
Jacques

Küçük not: bunu koleksiyona zincirlememek için ithalatı, ancak daha sonra kolelksiyonunuzu bir değişkene koyun ve $ collection-> getSelect () -> group ('e.entity_id');
Rickert

bu kodu nereden güncelleyebilirim?
zus

7

Normalde, bu verilerdeki veya toplama uygulamasındaki bir hatadır.

İşte daha geniş bir soruna bir çözüm. Bu, sadece toplama için değil, rastgele toplama üzerinde çalışır Catalog_Model_Product.

Adım 1. Değiştir çekirdek dosyası lib/Varien/Data/Collection.php, function addItem()fakat aksine bu cevabı da anlaşılacağı hatayı gizlemek değildir.

Bunun yerine, atılan istisnaya ek hata bilgileri ekleyin:

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

Adım 2. Sorunlu sorguyu hata raporunuzdan alın ve elle çalıştırın. Hangi kayıtların toplama anahtarını kopyaladığını görün. order by <key field>Gerektiği gibi ekleyin .

Katılan tabloları tek tek kaldırarak sorguyu inceleyin ve çoğaltmaya hangi kaydın neden olduğunu görün.

Bu yamanın özünde olması gerektiğine inanıyorum.


3

Sorununuz, aynı ürünün koleksiyona iki kez yüklenmesine yol açan bir koleksiyonunuz (birleştirme veya birleşim olması muhtemeldir).

Seçili nesneye farklı bir yöntem ekleyerek yüklenen koleksiyonu değiştirebilirsiniz.

Bkz. Http://framework.zend.com/manual/1.12/en/zend.db.select.html

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

Ancak bu doğal problemlerle birlikte gelir. Farklı kullanmak, performans cezalarıyla birlikte bellekte değil, diskte geçici tablolar oluşturulmasına neden olur.


0

Benim durumumda

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

çalışmıyor ben kullanın:

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

Mat bazı biri için hejpful olun

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.