Après avoir créé un envoi dans la zone d'administration de Magento, l'erreur suivante apparaît dans le var/report
dossier (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";}
la source
Réponses:
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 leDISTINCT
.la source
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
DISTINCT
etGROUP 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_order
et 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.
la source
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 leGrid.php
fichier.Les codes d'erreur sont:
Solution:
Nous avons utilisé
->group('value')
dans la fonction de filtre. Maintenant fonctionne bien ... !!!la source
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_Order
dans 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", ladistinct
solution 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_id
valeur mais différentesvalue_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/
la source
C'est mon code qui fonctionne bien après avoir le même problème:
J'ai ajouté -> groupe ('entity_id') pour résoudre le problème.
la source
vous devez essayer de remplacer
Mage_Sales_Model_Resource_Order_Grid_Collection::addItem
ce qui jette cette exception:la source