Bagaimana saya bisa memperbaiki "Item (Mage_Catalog_Model_Product) dengan id yang sama" xxx "sudah ada"?

18

Saya mendapatkan kesalahan ini saat mencoba memfilter koleksi produk

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist dan ingin bertanya apa yang bisa menyebabkan kesalahan karena hanya ada satu (terlihat) produk dengan ID yang sama di dalam Magento.

Apakah ada meja yang perlu dibersihkan untuk menghapus dupilcate ini?

pengguna1704524
sumber
Bisakah Anda menambahkan beberapa kode? Anda perlu menggunakan group byuntuk mendapatkan hanya id produk unik. Lihat magento.stackexchange.com/questions/12773/...
Renon Stewart
@ RS, Hai, saya masih berusaha menemukan penyebabnya, saya akan memposting kembali segera setelah saya melacaknya ...
user1704524

Jawaban:

36

Menambahkan distinctseperti yang disarankan dalam jawaban yang diterima memang memperbaiki masalah tetapi memiliki masalah kinerja. Basis data mungkin membuat tabel sementara pada disk saat menjalankan kueri dengan distinctdan ini akan memperlambat permintaan Anda. Sebagai gantinya Anda dapat menambahkan groupkondisi ke koleksi untuk menghapus duplikat.

Lihatlah postingan ini . Apa yang mereka lakukan (dan saya telah melakukannya juga) dikelompokkan oleh entitas id. Ini harus berkinerja lebih baik.

//adding filters to the collection..

$collection->getSelect()
           ->group('e.entity_id');
Vic
sumber
dapatkah Anda memberi tahu di mana kami perlu menambahkan kode ini
Baby in Magento
@BabyinMagento di mana pun Anda menggunakan koleksi Anda dalam kode khusus Anda. Kesalahan ini terjadi saat membuat modul khusus yang mengambil koleksi dari database. Ini berarti bisa muncul jika Anda telah menginstal modul pihak ketiga baru-baru ini. Dalam hal ini, tergantung pada pengembang modul tersebut untuk menemukan lokasi kesalahan.
Vic
The distinct()solusi dan ini akan menghapus catatan tambahan dari permintaan, yang berarti Anda mungkin kehilangan data tanpa memerhatikan. Jadi ini mungkin bukan solusi terbaik, seperti dalam kasus saya. Saya sekarang mencoba menemukan cara untuk mendapatkan kedua catatan dari tabel saya bergabung ke dalam koleksi sehingga saya bisa menampilkan kedua catatan pada baris yang sama di kotak.
Jacques
Catatan kecil: importendnya tidak untuk rantai ini ke koleksi, tetapi furst menempatkan colelction Anda ke variabel dan daripada $ collection-> getSelect () -> group ('e.entity_id');
Rickert
di mana saya dapat memperbarui kode ini?
zus
7

Biasanya, ini adalah bug dalam data atau dalam implementasi pengumpulan.

Inilah solusi untuk masalah yang lebih luas. Ini berfungsi pada koleksi sewenang-wenang, tidak hanya untuk Catalog_Model_Product.

Langkah 1. Memodifikasi file inti lib/Varien/Data/Collection.php, function addItem(), tapi tidak seperti jawaban ini menunjukkan, tidak menyembunyikan kesalahan.

Sebagai gantinya, tambahkan informasi kesalahan tambahan ke pengecualian yang dilemparkan:

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

Langkah 2. Ambil kueri yang menyinggung dari laporan kesalahan Anda dan jalankan dengan tangan. Lihat catatan apa yang menduplikasi kunci koleksi. Tambahkan order by <key field>sesuai kebutuhan.

Membedah kueri menghapus tabel yang berpartisipasi satu per satu, dan melihat catatan mana yang menyebabkan duplikasi.

Saya percaya tambalan ini harus menjadi inti.

Victor Sergienko
sumber
3

Masalah Anda adalah bahwa Anda memiliki koleksi (kemungkinan dengan gabungan atau gabungan) yang menghasilkan produk yang sama dimuat ke dalam koleksi dua kali.

Anda dapat mengubah koleksi yang dimuat dengan menambahkan metode berbeda ke objek yang dipilih.

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

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

Tetapi ini datang dengan masalah yang melekat. Menggunakan perbedaan akan menyebabkan tabel sementara dibuat di disk, bukan di memori, yang disertai dengan penalti kinerja.

choco-loo
sumber
0

Dalam kasus saya

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

tidak berfungsi saya gunakan:

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

Mat menjadi hejpful untuk seseorang juga

Hassan Ali Shahzad
sumber