Item (Mage_Sales_Model_Order) dengan id yang sama "X" sudah ada


12

Setelah membuat kiriman di area admin Magento, kesalahan berikut muncul di var/reportfolder (setelah halaman crash Magento default) saat melihat halaman kisi pesanan admin:

Item (Mage_Sales_Model_Order) with the same id "1234" already exist

Saya bisa menghilangkan kesalahan ini dengan menambahkan klausa DISTINCT ke selektor objek varien di app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.php, baris 662. Namun, saya benar-benar tidak ingin melakukan itu karena beberapa alasan (pertanyaan lambat mematikan, mengedit file inti, dll).

Apa cara terbaik untuk mengatasi ini sambil menjaga integritas data. Haruskah saya menghapus pesanan? Saya akan menghargai masukan konstruktif apa pun, terutama tentang apa yang akan menyebabkan konflik ini. Terima kasih.

- edit -

Inilah jejak tumpukan lengkap untuk kejelasan / untuk menunjukkan kebodohan saya:

a:5:{i:0;s:67:"Item (Mage_Sales_Model_Order) with the same id "1234" already exist";i:1;s:4829:"#0 lib/Varien/Data/Collection/Db.php(576): Varien_Data_Collection->addItem(Object(Mage_Sales_Model_Order))
#1 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(533): Varien_Data_Collection_Db->load()
#2 app/code/core/Mage/Adminhtml/Block/Sales/Order/Grid.php(61): Mage_Adminhtml_Block_Widget_Grid->_prepareCollection()
#3 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(626): Mage_Adminhtml_Block_Sales_Order_Grid->_prepareCollection()
#4 app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(632): Mage_Adminhtml_Block_Widget_Grid->_prepareGrid()
#5 app/code/core/Mage/Core/Block/Abstract.php(862): Mage_Adminhtml_Block_Widget_Grid->_beforeToHtml()
#6 app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#7 app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('grid', true)
#8 app/code/core/Mage/Adminhtml/Block/Widget/Grid/Container.php(77): Mage_Core_Block_Abstract->getChildHtml('grid')
#9 app/design/adminhtml/default/default/template/widget/grid/container.phtml(36): Mage_Adminhtml_Block_Widget_Grid_Container->getGridHtml()
#10 app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/html/m...')
#11 app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#12 app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#13 app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#14 app/code/core/Mage/Adminhtml/Block/Widget/Container.php(308): Mage_Adminhtml_Block_Template->_toHtml()
#15 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Widget_Container->_toHtml()
#16 app/code/core/Mage/Core/Block/Text/List.php(43): Mage_Core_Block_Abstract->toHtml()
#17 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Core_Block_Text_List->_toHtml()
#18 app/code/core/Mage/Core/Block/Abstract.php(582): Mage_Core_Block_Abstract->toHtml()
#19 app/code/core/Mage/Core/Block/Abstract.php(526): Mage_Core_Block_Abstract->_getChildHtml('content', true)
#20 app/design/adminhtml/default/default/template/page.phtml(74): Mage_Core_Block_Abstract->getChildHtml('content')
#21 app/code/core/Mage/Core/Block/Template.php(241): include('/var/www/html/m...')
#22 app/code/core/Mage/Core/Block/Template.php(272): Mage_Core_Block_Template->fetchView('adminhtml/defau...')
#23 app/code/core/Mage/Core/Block/Template.php(286): Mage_Core_Block_Template->renderView()
#24 app/code/core/Mage/Adminhtml/Block/Template.php(81): Mage_Core_Block_Template->_toHtml()
#25 app/code/core/Mage/Core/Block/Abstract.php(863): Mage_Adminhtml_Block_Template->_toHtml()
#26 app/code/core/Mage/Core/Model/Layout.php(555): Mage_Core_Block_Abstract->toHtml()
#27 app/code/core/Mage/Core/Controller/Varien/Action.php(390): Mage_Core_Model_Layout->getOutput()
#28 app/code/core/Mage/Adminhtml/controllers/Sales/OrderController.php(95): Mage_Core_Controller_Varien_Action->renderLayout()
#29 app/code/core/Mage/Core/Controller/Varien/Action.php(419): Mage_Adminhtml_Sales_OrderController->indexAction()
#30 app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(250): Mage_Core_Controller_Varien_Action->dispatch('index')
#31 app/code/core/Mage/Core/Controller/Varien/Front.php(176): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#32 app/code/core/Mage/Core/Model/App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
#33 app/Mage.php(683): Mage_Core_Model_App->run(Array)
#34 index.php(71): Mage::run('base', 'website')
#35 {main}";s:3:"url";s:72:"/index.php/admin/sales_order/index/key/0b7375aca52608483edc0cf879bd4361/";s:11:"script_name";s:10:"/index.php";s:4:"skin";s:5:"admin";}

8
FWIW Saya benci kesalahan bodoh ini dan telah menghabiskan lebih banyak waktu daripada saya mau mengakuinya.
philwinkle

Bisakah Anda memasukkan kueri koleksi atau kode php Anda?
Sukeshini

Jawaban:


10

Anda menambahkan sesuatu ke koleksi, yang menambahkan duplikat ke hasil kueri.

Apa yang dilakukan magento dengan hasil kueri adalah, untuk menghasilkan objek dari setiap baris dan kemudian menambahkan item ini ke koleksi. Jika item sudah ada, kesalahan ini dilemparkan.

Solusi: Apa pun yang Anda tambahkan, pastikan hasilnya berbeda.

Jika Anda menambahkan lebih banyak bidang di samping yang dari sales_flat_order, bidang ini mungkin berbeda, dan karena itu catatan disaring dengan DISTINCT.


6

Saya menambahkan jawaban karena saya belum dapat menambahkan komentar. Saya setuju dengan @fabian - namun saya mencegah penggunaan DISTINCTdan GROUP BY, biasanya Anda dapat memfilter gabungan Anda ke hasil yang berbeda jika Anda merencanakan dengan benar.

Misalnya (saya tahu ini adalah contoh sepele):

Jika Anda mengumpulkan pesanan menggunakan sales/flat_orderdan Anda bergabung dengan alamat pelanggan, ada dua catatan yang disimpan alamat penagihan dan alamat pengiriman . Untuk mengatasi masalah ini orang dapat menentukan jenis alamat yang ingin mereka gabungkan.

Ini terdengar mirip dengan situasi Anda, kecuali skenario ini.


3

Kami juga menghadapi beberapa masalah dalam sistem kami. Kami telah menganalisis masalah dan menemukan masalah saya Grid.php(contoh: /namespace/modulename/Block/Adminhtml/Sales/Order/Grid.php)

Kami telah menemukan _prepareCollection()fungsi dalam Grid.phpfile.

Pengodean kesalahan adalah:

//Error coding
$collection->join(array('payment' => 'sales/order_payment'), 'main_table.entity_id = parent_id', 'method')
            ->getSelect()
            ->where("`payment`.`method` like '%paypal%'");

Larutan:

//Solution coding
$collection->join(array('payment' => 'sales/order_payment'), 'main_table.entity_id = parent_id', 'method')
            ->getSelect()
            ->where("`payment`.`method` like '%paypal%'")
            ->group('method');

Kami telah menggunakan ->group('value')fungsi filter. Sekarang bekerja dengan baik ... !!!


3

Saya tahu ini adalah pertanyaan lama dan sudah dijawab tetapi saya ingin menambahkan jawaban saya karena saya rasa itu bisa membantu orang lain menghadapi masalah serupa. Saya mencoba menjelaskan penyebab umum dari jenis kesalahan ini.

Untuk mulai dengan, Mage_Sales_Model_Orderdalam instalasi Magento standar tidak boleh memberikan kesalahan seperti itu. Jadi saya menduga kesalahan ini disebabkan oleh ekstensi pihak ketiga (pengamat, metode kait, menulis ulang, dll) atau kustomisasi kode yang tidak benar yang merusak data di tempat pertama. Ketika berbicara tentang komponen inti yang bertindak "aneh" distinctsolusinya bahkan tidak harus ada karena data seharusnya tidak pernah rusak sejak awal! Lebih baik memperbaiki data itu sendiri terlebih dahulu daripada mengubah kode.

Saya menghadapi masalah yang sama ketika saya membangun tipe entitas EAV khusus dan semuanya bekerja dengan baik sampai saya mengedit salah satu entitas. Entah bagaimana, pengeditan menghasilkan nilai duplikat untuk salah satu atribut teks entitas, yaitu, dua baris dalam tabel nilai teks untuk atribut yang sama dari entitas yang sama. Kueri mentah hanya tabel custom_entity tampak sempurna tanpa duplikat (bagaimana mungkin? Kendala kunci utama sudah memastikan integritas) sehingga masalahnya ada di tempat lain.

Seperti yang mungkin sudah Anda duga saat memuat koleksi, karena gabungan yang digunakan untuk mengambil baris dari database dan mempertimbangkan ada dua nilai teks yang sama untuk atribut yang sama dari suatu entitas, ia mengambil dua baris dengan entity_idnilai yang sama tetapi berbeda value_id.

Sebagai aturan umum, ketika kesalahan tersebut muncul, Anda harus mencurigai bahwa baik data dalam basis data telah rusak atau bahwa gabungan yang terjadi ke kueri akhir akan mengambil dua baris yang hampir sama persis dari database, menduplikasi pengidentifikasi unik koleksi. barang.

Semoga ini membantu.

PS: Mengenai mengapa nilai teks eav yang digandakan dalam kasus saya, periksa komentar Marius di sini http://inchoo.net/magento/creating-an-eav-based-models-in-magento/


0

Ini kode saya telah bekerja dengan baik setelah mendapat masalah yang sama:

    $collection = Mage::getResourceModel('sales/order_grid_collection');
    $prefix = Mage::getConfig()->getTablePrefix();  

    $collection->getSelect()->joinleft(array('order'=> $prefix.'sales_flat_order'),'order.entity_id=main_table.entity_id',array('pdeliverydate'));   

    $collection->getSelect()->joinleft(array('address'=> $prefix.'sales_flat_order_address'),'address.parent_id=main_table.entity_id',array('telephone'))->group('entity_id');

    $this->setCollection($collection);
    return parent::_prepareCollection();

Saya telah menambahkan -> grup ('entitas_id') untuk menyelesaikan masalah.


Sudah disarankan 1 tahun yang lalu ( magento.stackexchange.com/a/139898/46249 ) ... -1.
sv3n

-1

Anda harus mencoba menimpa Mage_Sales_Model_Resource_Order_Grid_Collection::addItemyang melempar pengecualian ini:

<?php
class Fixed_Order_Grid_Collection extends Mage_Sales_Model_Resource_Order_Grid_Collection{

    public function addItem(Varien_Object $item)
    {
        $itemId = $this->_getItemId($item);

        if (!is_null($itemId)) {
            if (isset($this->_items[$itemId])) {
                //throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
            }
            $this->_items[$itemId] = $item;
        } else {
            $this->_addItem($item);
        }
        return $this;
    }
}
class MyCompony_MyExtention_Block_Adminhtml_OrderGrid extends Mage_Adminhtml_Block_Widget_Grid
{
     public function __construct()
    {
        parent::__construct();
        $this->setId('sales_order_grid');
        $this->setUseAjax(true);
        $this->setDefaultSort('created_at');
        $this->setDefaultDir('DESC');
        $this->setSaveParametersInSession(true);
    }
    protected function _getCollectionClass()
    {
        return 'sales/order_grid_collection';
    }

    protected function _prepareCollection()
    {
        $collection = new Fixed_Order_Grid_Collection();
        $select = $collection->getSelect();
        $select->join('sales_flat_order_item AS order_item', 'order_item.order_id=main_table.entity_id','quote_item_id',NULL);
        $select->distinct();
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }
...

1
Ini bukan solusi, tetapi hanya cara untuk menghilangkan pesan kesalahan.
Niels

1
Kesalahan squashing tidak sama dengan memperbaikinya, pertimbangkan untuk menambahkan perbedaan pada hasil koleksi Anda atau kelompok kueri bergabung dengan bidang.
DWils
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.