आइटम (Mage_Sales_Model_Order) के साथ एक ही आईडी "X" पहले से मौजूद है


12

Magento के व्यवस्थापक क्षेत्र में एक शिपमेंट बनाने के बाद var/report, व्यवस्थापक के ग्रिड पेज को देखने के बाद फ़ोल्डर में निम्नलिखित त्रुटि दिखाई देती है (डिफ़ॉल्ट Magento क्रैश पेज के बाद):

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

मैं app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.phpलाइन 662 में वियन ऑब्जेक्ट चयनकर्ता में एक DISTINCT क्लॉज जोड़कर इस त्रुटि से छुटकारा पा सकता हूं। हालांकि, मैं वास्तव में ऐसा नहीं करना चाहता हूं, कई कारणों से (मौत की धीमी गति से पूछताछ, कोर फ़ाइलों को संपादित करना, आदि)।

डेटा अखंडता बनाए रखते हुए इसे हल करने का सबसे अच्छा तरीका क्या है। क्या मुझे आदेश को हटा देना चाहिए? मैं किसी भी रचनात्मक इनपुट की सराहना करूंगा, विशेषकर इस बारे में कि पहली बार में इस संघर्ष का क्या कारण होगा। धन्यवाद।

- संपादित करें -

यहाँ स्पष्टता के लिए पूर्ण स्टैक ट्रेस / मेरी मूर्खता को इंगित करने के लिए है:

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 मैं इस गूंगा त्रुटि से नफरत करता हूं और मैंने डिबगिंग को स्वीकार करने की तुलना में अधिक समय बिताया है।
— 23

क्या आप अपना संग्रह क्वेरी या php कोड शामिल कर सकते हैं?
— सुकेशिनी '’

जवाबों:


10

आपने संग्रह में कुछ जोड़ा, जो डुप्लिकेट को क्वेरी परिणाम में जोड़ता है।

प्रत्येक पंक्ति से ऑब्जेक्ट उत्पन्न करने और फिर इन वस्तुओं को संग्रह में जोड़ने के लिए, क्वेरी परिणाम के साथ मैगनेटो क्या करता है। यदि आइटम पहले से मौजूद है, तो यह त्रुटि डाली गई है।

समाधान: आपने जो भी जोड़ा है, उसकी जांच करें कि आपका परिणाम अलग है।

यदि आपने sales_flat_orderइनमें से अधिक फ़ील्ड जोड़े हैं , तो ये फ़ील्ड भिन्न हो सकते हैं, और इसलिए इन्हें नोट फ़िल्टर किया गया है DISTINCT।


6

मैं एक जवाब जोड़ रहा हूँ क्योंकि मैं अभी तक एक टिप्पणी नहीं जोड़ सका। मैं @fabian से सहमत हूँ - हालाँकि मैं इसके उपयोग को हतोत्साहित करता हूँ DISTINCTऔर GROUP BY, आमतौर पर अगर आप सही तरीके से योजना बनाते हैं, तो आप अपने जुड़ने को एक अलग परिणाम पर फ़िल्टर कर सकते हैं।

उदाहरण के लिए (मुझे पता है कि यह एक मामूली उदाहरण है):

यदि आप एक ऑर्डर का उपयोग करके इकट्ठा करना चाहते थे sales/flat_orderऔर आप ग्राहकों के पते में शामिल हो गए थे, तो एक बिलिंग पते और डिलीवरी पते को संग्रहीत दो रिकॉर्ड हैं । इस समस्या को हल करने के लिए कोई भी निर्दिष्ट कर सकता है कि वे किस प्रकार के पते से जुड़ना चाहते हैं।

यह आपकी स्थिति के समान है, इस परिदृश्य को छोड़कर नहीं।


3

हमें अपनी प्रणाली में कुछ मुद्दों का भी सामना करना पड़ता है। हमने समस्या का विश्लेषण किया है और मेरा Grid.php(उदाहरण: /namespace/modulename/Block/Adminhtml/Sales/Order/Grid.php) पाया है

हमने फ़ाइल _prepareCollection()में फ़ंक्शन पाया है Grid.php।

त्रुटि कोडिंग हैं:

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

उपाय:

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

हम ->group('value')फिल्टर समारोह में उपयोग किया है। अब ठीक काम कर रहा है ... !!!


3

मुझे पता है कि यह एक पुराना प्रश्न है और इसका उत्तर पहले ही दिया जा चुका है, लेकिन मैं अपना उत्तर जोड़ना चाहता हूं क्योंकि मुझे लगता है कि यह अन्य समान समस्याओं का सामना करने में मदद कर सकता है। मैं इस प्रकार की त्रुटि के सामान्य कारणों की व्याख्या करने का प्रयास कर रहा हूं।

शुरुआत के लिए, Mage_Sales_Model_Orderएक मानक Magento की स्थापना में ऐसी त्रुटि कभी नहीं देनी चाहिए। इसलिए मुझे संदेह है कि यह त्रुटि तीसरे पक्ष के विस्तार (पर्यवेक्षक, हुक विधि, फिर से लिखना, आदि) या एक अनुचित कोड अनुकूलन के कारण है जो पहले स्थान पर डेटा को दूषित करता है। जब "अजीब" अभिनय करने वाले मुख्य घटकों के बारे में बात की जाती है, तो distinctसमाधान भी मौजूद नहीं होना चाहिए क्योंकि डेटा को पहले स्थान पर कभी भी भ्रष्ट नहीं होना चाहिए! कोड बदलने से पहले डेटा को पहले से ही ठीक कर लें।

जब मैंने एक कस्टम ईएवी इकाई प्रकार का निर्माण किया और जब तक मैंने किसी एक संस्था को संपादित नहीं किया तब तक सब कुछ ठीक था, मुझे इसी तरह की समस्या का सामना करना पड़ा। किसी तरह, संपादन से इकाई की पाठ विशेषताओं में से एक के लिए डुप्लिकेट मान होता है, अर्थात, एक ही इकाई की समान विशेषता के लिए पाठ मान तालिका में दो पंक्तियाँ। केवल कस्टम_एंटिटी तालिका को क्वेरी करते हुए कोई डुप्लिकेट के साथ बिल्कुल ठीक दिख रहा था (यह कैसे हो सकता है? प्राथमिक कुंजी बाधा पहले से ही अखंडता सुनिश्चित करता है) इसलिए समस्या कहीं और थी।

जैसा कि आपने संग्रह को लोड करते समय पहले ही अनुमान लगा लिया होगा, क्योंकि डेटाबेस से पंक्तियों को पुनर्प्राप्त करने के लिए उपयोग किए जाने वाले जोड़ और इकाई के एक ही विशेषता के लिए दो समान पाठ मान थे, इसने दो पंक्तियों को एक ही entity_idमूल्य के साथ पुनर्प्राप्त किया, लेकिन अलग value_id।

एक सामान्य नियम के रूप में, जब ऐसी कोई त्रुटि उत्पन्न होती है, तो आपको संदेह होना चाहिए कि या तो डेटाबेस में डेटा पहले से ही दूषित हो चुका है या जो अंतिम क्वेरी को नीचे ले जाते हैं, वे डेटाबेस से दो लगभग सटीक पंक्तियों को पुनः प्राप्त कर लेंगे, संग्रह के अद्वितीय पहचानकर्ता की नकल करेंगे आइटम नहीं है।

उम्मीद है की यह मदद करेगा।

पुनश्च: मेरे मामले में डुप्लिकेट किए गए ईआरवी पाठ मूल्य क्यों, के रूप में यहाँ मारियस की टिप्पणी देखें http://inchoo.net/magento/creating-an-eav-based-models-in-magento/


0

यह वही समस्या है जिसके बाद मेरा कोड अच्छा काम कर रहा है:

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

मेरे पास समस्या को हल करने के लिए -> समूह ('unit_id') है।


पहले से ही 1 वर्ष पहले सुझाव दिया गया था ( magento.stackexchange.com/a/139898/46249 ) ... -1।
— sv3n

-1

आपको यह अति करने की कोशिश करनी होगी Mage_Sales_Model_Resource_Order_Grid_Collection::addItemजो इस छूट को फेंकता है:

<?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
यह एक समाधान नहीं है, लेकिन केवल त्रुटि संदेश से छुटकारा पाने का एक तरीका है।
— नील्स

1
त्रुटियों को ठीक करना उन्हें ठीक करने के समान नहीं है, अपने संग्रह परिणाम में विशिष्ट जोड़ने पर विचार करें या एक क्षेत्र द्वारा ज्वाइन क्वेरी को समूह बनाएं।
— DWIL
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.