L'article (Mage_Sales_Model_Order) avec le même identifiant «X» existe déjà


12

Après avoir créé un envoi dans la zone d'administration de Magento, l'erreur suivante apparaît dans le var/reportdossier (après une page de plantage par défaut de Magento) lors de l'affichage de la page de la grille de commande administrateur:

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

Je peux me débarrasser de cette erreur en ajoutant une clause DISTINCT au sélecteur d'objet varien app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.php, ligne 662. Cependant, je ne veux vraiment pas le faire pour plusieurs raisons (requêtes lentes, éditer les fichiers core, etc.).

Quelle est la meilleure façon de résoudre ce problème tout en préservant l'intégrité des données. Dois-je supprimer la commande? J'apprécierais toute contribution constructive, en particulier sur ce qui provoquerait ce conflit en premier lieu. Merci.

-- Éditer --

Voici la trace complète de la pile pour plus de clarté / pour souligner ma 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 Je déteste cette erreur stupide et j'ai passé plus de temps que je ne veux l'admettre.
philwinkle

Pouvez-vous inclure votre requête de collecte ou votre code php?
Sukeshini

Réponses:


10

Vous avez ajouté quelque chose à la collection, ce qui ajoute des doublons au résultat de la requête.

Ce que magento fait avec le résultat de la requête, c'est de générer un objet à partir de chaque ligne, puis d'ajouter ces éléments à la collection. Si l'élément existe déjà, cette erreur est levée.

Solution: Quelle que soit la jointure que vous avez ajoutée, vérifiez que votre résultat est distinct.

Si vous avez ajouté plus de champs à côté de ceux de sales_flat_order, ces champs peuvent différer, et par conséquent ils sont filtrés par note avec le DISTINCT.


6

J'ajoute une réponse car je n'ai pas encore pu ajouter de commentaire. Je suis d'accord avec @fabian - mais je décourage l'utilisation de DISTINCTet GROUP BY, généralement, vous pouvez filtrer votre jointure en un seul résultat distinct si vous planifiez correctement.

Par exemple (je sais que c'est un exemple trivial):

Si vous deviez récupérer une commande en utilisant sales/flat_orderet que vous avez joint l'adresse du client, deux enregistrements stockent une adresse de facturation et une adresse de livraison . Pour résoudre ce problème, on peut spécifier le type d'adresse auquel ils souhaitent se joindre.

Cela ressemble à votre situation, sauf ce scénario.


3

Nous avons également rencontré des problèmes dans notre système. Nous avons analysé le problème et trouvé mon Grid.php(exemple: /namespace/modulename/Block/Adminhtml/Sales/Order/Grid.php)

Nous avons trouvé la _prepareCollection()fonction dans le Grid.phpfichier.

Les codes d'erreur sont:

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

Solution:

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

Nous avons utilisé ->group('value')dans la fonction de filtre. Maintenant fonctionne bien ... !!!


3

Je sais que c'est une vieille question à laquelle il a déjà été répondu, mais je veux ajouter ma réponse car je pense que cela pourrait aider d'autres personnes confrontées à des problèmes similaires. J'essaie d'expliquer les causes générales de ce type d'erreur.

Pour commencer, Mage_Sales_Model_Orderdans une installation standard de Magento ne devrait jamais donner une telle erreur. Je soupçonne donc que cette erreur est causée par une extension tierce (observateur, méthode de raccordement, réécriture, etc.) ou une personnalisation de code incorrecte qui a corrompu les données en premier lieu. Quand on parle de composants de base agissant "bizarrement", la distinctsolution ne devrait même pas exister car les données n'auraient jamais dû être corrompues en premier lieu! Mieux vaut d'abord corriger les données que changer le code.

J'ai rencontré un problème similaire lorsque j'ai créé un type d'entité EAV personnalisé et tout a bien fonctionné jusqu'à ce que j'édite l'une des entités. D'une manière ou d'une autre, la modification a entraîné une valeur en double pour l'un des attributs de texte de l'entité, c'est-à-dire deux lignes dans la table de valeurs de texte pour le même attribut de la même entité. L'interrogation brute de la table custom_entity semblait parfaitement correcte sans doublon (comment pourrait-il être? La contrainte de clé primaire garantissait déjà l'intégrité), donc le problème était ailleurs.

Comme vous l'avez peut-être déjà deviné lors du chargement de la collection, en raison des jointures utilisées pour récupérer les lignes de la base de données et considérant qu'il y avait deux mêmes valeurs de texte pour le même attribut d'une entité, il a récupéré deux lignes avec la même entity_idvaleur mais différentes value_id.

En règle générale, lorsqu'une telle erreur se produit, vous devez suspecter que les données de la base de données ont déjà été corrompues ou que les jointures qui ont lieu dans la requête finale récupéreront deux lignes presque exactes de la base de données, dupliquant l'identifiant unique de la collection articles.

J'espère que cela t'aides.

PS: Quant à savoir pourquoi la valeur du texte eav dupliqué dans mon cas, consultez le commentaire de Marius ici http://inchoo.net/magento/creating-an-eav-based-models-in-magento/


0

C'est mon code qui fonctionne bien après avoir le même problème:

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

J'ai ajouté -> groupe ('entity_id') pour résoudre le problème.


Déjà suggéré il y a 1 an ( magento.stackexchange.com/a/139898/46249 ) ... -1.
sv3n

-1

vous devez essayer de remplacer Mage_Sales_Model_Resource_Order_Grid_Collection::addItemce qui jette cette exception:

<?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
Ce n'est pas une solution, mais simplement un moyen de se débarrasser du message d'erreur.
Niels

1
Écraser les erreurs n'est pas la même chose que les corriger, pensez à ajouter des éléments distincts au résultat de votre collection ou à regrouper la requête de jointure par un champ.
DWils
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.