รายการ (Mage_Sales_Model_Order) ที่มี id เดียวกัน“ X” มีอยู่แล้ว


12

หลังจากสร้างการจัดส่งในพื้นที่ผู้ดูแลระบบของ Magento ข้อผิดพลาดต่อไปนี้จะปรากฏขึ้นในvar/reportโฟลเดอร์ (หลังจากหน้าข้อผิดพลาดของ Magento เริ่มต้น) เมื่อดูหน้าตารางคำสั่งของผู้ดูแลระบบ:

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

ฉันสามารถกำจัดข้อผิดพลาดนี้ได้โดยเพิ่มส่วนคำสั่ง DISTINCT ให้กับตัวเลือกอ็อบเจกต์ Varien ในapp/code/core/Mage/Eav/Model/Entity/Collection/Abstact.phpบรรทัด 662 อย่างไรก็ตามฉันไม่ต้องการทำเช่นนั้นด้วยเหตุผลหลายประการ

เป็นวิธีที่ดีที่สุดในการแก้ปัญหานี้ในขณะที่รักษาความสมบูรณ์ของข้อมูล ฉันควรจะลบคำสั่งซื้อหรือไม่ ฉันขอขอบคุณอินพุตที่สร้างสรรค์โดยเฉพาะอย่างยิ่งเกี่ยวกับสิ่งที่จะทำให้เกิดความขัดแย้งนี้ในตอนแรก ขอบคุณ

- แก้ไข -

นี่คือการติดตามสแต็คเต็มรูปแบบเพื่อความชัดเจน / เพื่อชี้ให้เห็นความโง่เขลาของฉัน:

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 ฉันเกลียดข้อผิดพลาดที่เป็นใบ้นี้และใช้เวลามากกว่าที่ฉันจะยอมรับเพื่อแก้ไขข้อบกพร่อง
philwinkle

คุณสามารถใส่คิวรี่การรวบรวมหรือรหัส php ได้หรือไม่?
Sukeshini

คำตอบ:


10

คุณเพิ่มบางสิ่งลงในคอลเลกชันซึ่งเพิ่มรายการซ้ำลงในผลลัพธ์แบบสอบถาม

วีโอไอพีทำอะไรกับผลลัพธ์ของแบบสอบถามเพื่อสร้างวัตถุจากแต่ละแถวแล้วเพิ่มรายการเหล่านี้ลงในคอลเลกชัน หากรายการมีอยู่แล้วข้อผิดพลาดนี้จะถูกโยน

การแก้ไข: ไม่ว่าคุณจะเพิ่มอะไรเข้าร่วมตรวจสอบว่าผลลัพธ์ของคุณแตกต่าง

หากคุณเพิ่มเขตข้อมูลเพิ่มเติมข้างคนจากเขตข้อมูลเหล่านี้อาจแตกต่างกันและดังนั้นพวกเขาจะถูกบันทึกกรองด้วยsales_flat_orderDISTINCT


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แก้ปัญหาไม่ควรเกิดขึ้นเพราะข้อมูลไม่ควรได้รับความเสียหายตั้งแต่แรก! แก้ไขข้อมูลเองได้ดีกว่าการเปลี่ยนรหัส

ฉันประสบปัญหาคล้ายกันเมื่อฉันสร้างเอนทิตี EAV ที่กำหนดเองและทุกอย่างทำงานได้ดีจนกระทั่งฉันแก้ไขเอนทิตีหนึ่งรายการ อย่างไรก็ตามการแก้ไขส่งผลให้มีค่าซ้ำกันสำหรับหนึ่งในแอตทริบิวต์ข้อความของเอนทิตี้นั่นคือสองแถวในตารางค่าข้อความสำหรับแอตทริบิวต์เดียวกันของเอนทิตีเดียวกัน การสืบค้นดิบเฉพาะตาราง custom_entity ดูดีอย่างสมบูรณ์โดยไม่มีการซ้ำซ้อน (เป็นไปได้อย่างไรข้อ จำกัด คีย์หลักทำให้มั่นใจในความสมบูรณ์แล้ว) ดังนั้นปัญหาจึงอยู่ที่อื่น

ขณะที่คุณอาจจะเดาได้อยู่แล้วเมื่อโหลดคอลเลกชันเพราะการร่วมใช้ในการเรียกแถวจากฐานข้อมูลและพิจารณามีอยู่สองค่าข้อความเหมือนกันสำหรับแอตทริบิวต์เดียวกันของนิติบุคคลนั้นมันดึงสองแถวเดียวกับentity_idค่า value_idแต่ที่แตกต่างกัน

ตามกฎทั่วไปเมื่อเกิดข้อผิดพลาดดังกล่าวคุณควรสงสัยว่าข้อมูลในฐานข้อมูลเสียหายหรือว่าการรวมที่เกิดขึ้นแบบสอบถามสุดท้ายจะดึงแถวที่แน่นอนเกือบสองแถวออกจากฐานข้อมูลโดยทำซ้ำตัวระบุเฉพาะของคอลเลกชัน รายการ

หวังว่านี่จะช่วยได้

PS: สำหรับสาเหตุที่มูลค่าข้อความ eav ซ้ำกันในกรณีของฉันตรวจสอบความคิดเห็นของ Marius ที่นี่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();

ฉันได้เพิ่ม -> กลุ่ม ('เอนทิตี _id') เพื่อแก้ปัญหา


แนะนำ 1y ago แล้ว ( 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
นี่ไม่ใช่วิธีการแก้ปัญหา แต่เป็นเพียงวิธีการกำจัดข้อความแสดงข้อผิดพลาด
Niels

1
ข้อผิดพลาดในการลบหน้าจอไม่เหมือนกับการแก้ไขให้พิจารณาการเพิ่มผลการรวบรวมที่แตกต่างกันของคุณหรือจัดกลุ่มแบบสอบถามการเข้าร่วมตามเขตข้อมูล
DWils
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.