Ya existe un elemento (Mage_Sales_Model_Order) con el mismo id "X"


12

Después de crear un envío en el área de administración de Magento, aparece el siguiente error en la var/reportcarpeta (después de una página de bloqueo predeterminada de Magento) al ver la página de la cuadrícula de órdenes de administración:

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

Puedo deshacerme de este error agregando una cláusula DISTINCT al selector de objetos varien en la app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.phplínea 662. Sin embargo, realmente no quiero hacerlo por varias razones (consultas lentas, edición de archivos principales, etc.).

¿Cuál es la mejor manera de resolver esto mientras se mantiene la integridad de los datos? ¿Debo eliminar el pedido? Agradecería cualquier aporte constructivo, especialmente sobre lo que causaría este conflicto en primer lugar. Gracias.

- editar -

Aquí está el rastro completo de la pila para mayor claridad / para señalar mi estupidez:

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 este error tonto y he pasado más tiempo del que me gustaría admitir para depurarlo.
philwinkle

¿Puedes incluir tu consulta de colección o código php?
Sukeshini

Respuestas:


10

Agregó algo a la colección, que agrega duplicados al resultado de la consulta.

Lo que hace magento con el resultado de la consulta es generar un objeto a partir de cada fila y luego agregar estos elementos a la colección. Si el elemento ya existe, se genera este error.

Solución: cualquiera que sea la unión que agregue, verifique que su resultado sea distinto.

Si agregó más campos además de los de sales_flat_order, estos campos pueden diferir y, por lo tanto, se filtran con la nota DISTINCT.


6

Estoy agregando una respuesta ya que aún no puedo agregar un comentario. Estoy de acuerdo con @fabian; sin embargo, desaconsejo el uso de DISTINCTy GROUP BY, por lo general, puede filtrar su unión a un único resultado distinto si planifica correctamente.

Por ejemplo (sé que este es un ejemplo trivial):

Si tuviera que recoger un pedido utilizando sales/flat_ordery se uniera a la dirección de los clientes, hay dos registros almacenados: una dirección de facturación y una dirección de entrega . Para resolver este problema, se puede especificar a qué tipo de dirección desean unirse.

Esto suena similar a su situación, excepto que no este escenario.


3

También hemos enfrentado algún problema en nuestro sistema. Analizamos el problema y encontramos mi Grid.php(ejemplo: /namespace/modulename/Block/Adminhtml/Sales/Order/Grid.php)

Hemos encontrado la _prepareCollection()función en el Grid.phparchivo.

Los códigos de error son:

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

Solución:

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

Tenemos uso ->group('value')en la función de filtro. Ahora funciona bien ... !!!


3

Sé que esta es una pregunta antigua y ya ha sido respondida, pero quiero agregar mi respuesta porque siento que podría ayudar a otros que enfrentan problemas similares. Estoy tratando de explicar las causas generales de este tipo de error.

Para empezar, Mage_Sales_Model_Orderen una instalación estándar de Magento nunca se debe dar ese error. Por lo tanto, sospecho que este error es causado por una extensión de terceros (observador, método de enlace, reescritura, etc.) o una personalización de código incorrecta que corrompió los datos en primer lugar. Cuando se habla de componentes centrales que actúan de forma "extraña", la distinctsolución ni siquiera debería existir porque los datos nunca deberían haberse corrompido en primer lugar. Mejor arregle los datos primero que cambiar el código.

Me enfrenté a un problema similar cuando construí un tipo de entidad EAV personalizado y todo funcionó bien hasta que edité una de las entidades. De alguna manera, la edición resultó en un valor duplicado para uno de los atributos de texto de la entidad, es decir, dos filas en la tabla de valores de texto para el mismo atributo de la misma entidad. Las consultas sin procesar solo en la tabla custom_entity se veían perfectamente bien sin duplicados (¿cómo podría ser? La restricción de clave principal ya garantizaba la integridad), por lo que el problema estaba en otro lugar.

Como ya habrás adivinado al cargar la colección, debido a las uniones utilizadas para recuperar las filas de la base de datos y considerando que había dos mismos valores de texto para el mismo atributo de una entidad, recuperó dos filas con el mismo entity_idvalor pero diferentes value_id.

Como regla general, cuando se produce un error de este tipo, debe sospechar que los datos de la base de datos ya se han dañado o que las uniones que tienen lugar en la consulta final recuperarán dos filas casi exactas de la base de datos, duplicando el identificador único de la colección artículos.

Espero que esto ayude.

PD: En cuanto a por qué el valor de texto eav duplicado en mi caso, verifique el comentario de Marius aquí http://inchoo.net/magento/creating-an-eav-based-models-in-magento/


0

Este es mi código que funciona bien después de tener el mismo 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();

He agregado -> group ('entity_id') para resolver el problema.


Ya sugerido hace 1 año ( magento.stackexchange.com/a/139898/46249 ) ... -1.
sv3n

-1

tienes que intentar anular lo Mage_Sales_Model_Resource_Order_Grid_Collection::addItemque arroja esta excepción:

<?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
Esta no es una solución, sino simplemente una forma de deshacerse del mensaje de error.
Niels

1
Los errores de aplastamiento no son lo mismo que corregirlos, considere agregar distintos al resultado de su colección o agrupe la consulta de unión por un campo.
DWils
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.