L'articolo (Mage_Sales_Model_Order) con lo stesso ID "X" esiste già


12

Dopo aver creato una spedizione nell'area di amministrazione di Magento, il seguente errore appare nella var/reportcartella (dopo una pagina di arresto anomalo di Magento predefinita) quando si visualizza la pagina della griglia dell'ordine di amministrazione:

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

Posso eliminare questo errore aggiungendo una clausola DISTINCT al selettore di oggetti varien nella app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.phpriga 662. Tuttavia, non voglio davvero farlo per diversi motivi (query mortalmente lente, modifica di file core, ecc.).

Qual è il modo migliore per risolverlo mantenendo l'integrità dei dati. Devo cancellare l'ordine? Gradirei qualsiasi input costruttivo, in particolare su ciò che causerebbe questo conflitto in primo luogo. Grazie.

-- modificare --

Ecco la traccia dello stack completo per chiarezza / per sottolineare la mia stupidità:

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 Odio questo stupido errore e ho trascorso più tempo di quello che mi interessa ammettere il debug.
Filwinkle,

Puoi includere la tua query di raccolta o il codice php?
Sukeshini,

Risposte:


10

Hai aggiunto qualcosa alla raccolta, che aggiunge duplicati al risultato della query.

Ciò che fa magento con il risultato della query è generare oggetto da ogni riga e quindi aggiungere questi elementi alla raccolta. Se l'elemento esiste già, viene generato questo errore.

Soluzione: qualunque sia il join aggiunto, verificare che il risultato sia distinto.

Se sono stati aggiunti più campi oltre a quelli di sales_flat_order, questi campi potrebbero differire e pertanto vengono annotati con il filtro DISTINCT.


6

Sto aggiungendo una risposta poiché non sono ancora riuscito ad aggiungere un commento. Sono d'accordo con @fabian - tuttavia scoraggio l'uso di DISTINCTe GROUP BY, di solito, puoi filtrare il tuo join su un singolo risultato distinto se pianifichi correttamente.

Ad esempio (so che questo è un esempio banale):

Se si dovesse raccogliere un ordine utilizzando sales/flat_ordere si è inserito l'indirizzo dei clienti, ci sono due record memorizzati un indirizzo di fatturazione e un indirizzo di consegna . Per risolvere questo problema è possibile specificare a quale tipo di indirizzo si desidera unirsi.

Sembra simile alla tua situazione, tranne che per questo scenario.


3

Abbiamo anche riscontrato alcuni problemi nel nostro sistema. Abbiamo analizzato il problema e trovato il mio Grid.php(esempio: /namespace/modulename/Block/Adminhtml/Sales/Order/Grid.php)

Abbiamo trovato la _prepareCollection()funzione nel Grid.phpfile.

I codici di errore sono:

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

Soluzione:

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

Abbiamo usato ->group('value')nella funzione filtro. Ora funziona benissimo ... !!!


3

So che questa è una vecchia domanda a cui è già stata data una risposta, ma voglio aggiungere la mia risposta perché ritengo che possa aiutare altri che affrontano problemi simili. Sto cercando di spiegare le cause generali di questo tipo di errore.

Per cominciare, Mage_Sales_Model_Orderin un'installazione standard di Magento non dovrebbe mai dare un simile errore. Quindi sospetto che questo errore sia causato da un'estensione di terze parti (osservatore, metodo hook, riscrittura, ecc.) O da una personalizzazione errata del codice che ha danneggiato i dati in primo luogo. Quando si parla di componenti core che agiscono come "strani", la distinctsoluzione non dovrebbe nemmeno esistere perché i dati non avrebbero mai dovuto essere danneggiati in primo luogo! Meglio correggere prima i dati stessi che cambiare il codice.

Ho riscontrato un problema simile quando ho creato un tipo di entità EAV personalizzato e tutto ha funzionato bene fino a quando non ho modificato una delle entità. In qualche modo, la modifica ha prodotto un valore duplicato per uno degli attributi di testo dell'entità, ovvero due righe nella tabella dei valori di testo per lo stesso attributo della stessa entità. L'interrogazione non elaborata solo la tabella custom_entity sembrava perfettamente soddisfacente senza duplicati (come potrebbe essere? Il vincolo della chiave primaria ha già assicurato l'integrità), quindi il problema era altrove.

Come avrai già intuito durante il caricamento della raccolta, a causa dei join utilizzati per recuperare le righe dal database e considerando che c'erano due stessi valori di testo per lo stesso attributo di un'entità, ha recuperato due righe con lo stesso entity_idvalore ma diverse value_id.

Come regola generale, quando si verifica un errore del genere, è necessario sospettare che entrambi i dati nel database siano già stati danneggiati o che i join che avvengono nella query finale recuperino dal database due righe quasi esatte, duplicando l'identificatore univoco della raccolta elementi.

Spero che sia di aiuto.

PS: Per quanto riguarda il motivo per cui il valore di eav duplicato nel mio caso, controlla il commento di Marius qui http://inchoo.net/magento/creating-an-eav-based-models-in-magento/


0

Questo è il mio codice ha funzionato bene dopo lo stesso problema:

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

Ho aggiunto -> gruppo ('entity_id') per risolvere il problema.


Già suggerito 1 anno fa ( magento.stackexchange.com/a/139898/46249 ) ... -1.
sv3n

-1

devi provare a scavalcare ciò Mage_Sales_Model_Resource_Order_Grid_Collection::addItemche genera questa eccezione:

<?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
Questa non è una soluzione, ma semplicemente un modo per sbarazzarsi del messaggio di errore.
Niels,

1
La compressione degli errori non equivale a correggerli, considera di aggiungere distinti al risultato della raccolta o raggruppa la query di join in base a un campo.
DWils,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.