Mục (Mage_Sales_Model_Order) có cùng id Id X X đã tồn tại


12

Sau khi tạo một lô hàng trong khu vực quản trị của Magento, lỗi sau xuất hiện trong var/reportthư mục (sau trang sự cố Magento mặc định) khi xem trang lưới của đơn đặt hàng quản trị viên:

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

Tôi có thể loại bỏ lỗi này bằng cách thêm mệnh đề DISTINCT vào bộ chọn đối tượng varien trong app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.phpdòng 662. Tuy nhiên, tôi thực sự không muốn làm điều đó vì nhiều lý do (truy vấn chậm chết người, chỉnh sửa tệp lõi, v.v.).

Cách tốt nhất để giải quyết điều này trong khi duy trì tính toàn vẹn dữ liệu. Tôi có nên xóa đơn hàng? Tôi sẽ đánh giá cao bất kỳ đầu vào mang tính xây dựng nào, đặc biệt là về những gì sẽ gây ra xung đột này ngay từ đầu. Cảm ơn.

-- biên tập --

Đây là dấu vết ngăn xếp đầy đủ cho rõ ràng / để chỉ ra sự ngu ngốc của tôi:

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 Tôi ghét lỗi ngu ngốc này và đã dành nhiều thời gian hơn tôi quan tâm để thừa nhận gỡ lỗi nó.
philwinkle

Bạn có thể bao gồm truy vấn bộ sưu tập của bạn hoặc mã php?
Sukeshini

Câu trả lời:


10

Bạn đã thêm một cái gì đó vào bộ sưu tập, trong đó thêm các bản sao vào kết quả truy vấn.

Những gì magento làm với kết quả truy vấn là, để tạo đối tượng từ mỗi hàng và sau đó thêm các mục này vào bộ sưu tập. Nếu mục đã tồn tại, lỗi này được đưa ra.

Giải pháp: Bất kể bạn tham gia gì, hãy kiểm tra xem kết quả của bạn có khác biệt không.

Nếu bạn đã thêm nhiều trường bên cạnh các trường từ sales_flat_order, các trường này có thể khác nhau và do đó chúng được ghi chú được lọc với DISTINCT.


6

Tôi đang thêm một câu trả lời vì tôi chưa thể thêm một bình luận. Tôi đồng ý với @fabian - tuy nhiên tôi không khuyến khích việc sử dụng DISTINCTGROUP BY , thông thường bạn có thể lọc kết nối của mình thành một kết quả khác biệt duy nhất nếu bạn lập kế hoạch chính xác.

Ví dụ (tôi biết đây là một ví dụ tầm thường):

Nếu bạn đã thu thập một đơn đặt hàng bằng cách sử dụng sales/flat_ordervà bạn đã tham gia địa chỉ của khách hàng, có hai bản ghi được lưu trữ một địa chỉ thanh toánđịa chỉ giao hàng . Để giải quyết vấn đề này, người ta có thể chỉ định loại địa chỉ nào họ muốn tham gia.

Điều này nghe có vẻ giống với tình huống của bạn, ngoại trừ không phải kịch bản này.


3

Chúng tôi cũng đã phải đối mặt với một số vấn đề trong hệ thống của chúng tôi. Chúng tôi đã phân tích vấn đề và tìm thấy Grid.php(ví dụ: /namespace/modulename/Block/Adminhtml/Sales/Order/Grid.php)

Chúng tôi đã tìm thấy _prepareCollection()chức năng trong Grid.phptập tin.

Lỗi mã hóa là:

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

Giải pháp:

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

Chúng tôi đã sử dụng ->group('value')trong chức năng lọc. Bây giờ làm việc tốt ... !!!


3

Tôi biết đây là một câu hỏi cũ và nó đã được trả lời nhưng tôi muốn thêm câu trả lời của mình vì tôi cảm thấy nó có thể giúp những người khác đối mặt với những vấn đề tương tự. Tôi đang cố gắng giải thích các nguyên nhân chung của loại lỗi này.

Để bắt đầu, Mage_Sales_Model_Ordertrong một cài đặt Magento tiêu chuẩn không bao giờ nên có lỗi như vậy. Vì vậy, tôi nghi ngờ lỗi này là do tiện ích mở rộng của bên thứ ba (người quan sát, phương thức hook, viết lại, v.v.) hoặc tùy chỉnh mã không đúng làm hỏng dữ liệu ở vị trí đầu tiên. Khi nói về các thành phần cốt lõi hoạt động "kỳ lạ", distinctgiải pháp thậm chí không tồn tại vì dữ liệu không bao giờ bị hỏng ngay từ đầu! Sửa lỗi dữ liệu trước tiên tốt hơn là thay đổi mã.

Tôi đã gặp phải một vấn đề tương tự khi tôi xây dựng một loại thực thể EAV tùy chỉnh và mọi thứ đều hoạt động tốt cho đến khi tôi chỉnh sửa một trong các thực thể. Bằng cách nào đó, việc chỉnh sửa dẫn đến giá trị trùng lặp cho một trong các thuộc tính văn bản của thực thể, nghĩa là, hai hàng trong bảng giá trị văn bản cho cùng một thuộc tính của cùng một thực thể. Truy vấn thô chỉ có bảng custom_entity trông hoàn toàn ổn mà không có sự trùng lặp (làm thế nào có thể là "ràng buộc khóa chính đã đảm bảo tính toàn vẹn) nên vấn đề nằm ở một nơi khác.

Như bạn có thể đã đoán khi tải bộ sưu tập, do các phép nối được sử dụng để truy xuất các hàng từ cơ sở dữ liệu và xem xét có hai giá trị văn bản giống nhau cho cùng một thuộc tính của một thực thể, nó đã truy xuất hai hàng có cùng entity_idgiá trị nhưng khác nhau value_id.

Theo nguyên tắc chung, khi xảy ra lỗi như vậy, bạn nên nghi ngờ rằng dữ liệu trong cơ sở dữ liệu đã bị hỏng hoặc các liên kết diễn ra truy vấn cuối cùng sẽ lấy hai hàng gần như chính xác từ cơ sở dữ liệu, sao chép định danh duy nhất của bộ sưu tập mặt hàng.

Hi vọng điêu nay co ich.

PS: Về lý do tại sao giá trị văn bản eav trùng lặp trong trường hợp của tôi, hãy kiểm tra nhận xét của Marius tại đây http://inchoo.net/magento/creating-an-eav-basing-models-in-magento/


0

Đây là mã của tôi đã hoạt động tốt sau khi gặp vấn đề tương tự:

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

Tôi có thêm -> nhóm ('entity_id') để giải quyết vấn đề.


Đã được đề xuất 1 năm trước ( magento.stackexchange.com/a/139898/46249 ) ... -1.
sv3n

-1

bạn phải cố gắng ghi đè lên Mage_Sales_Model_Resource_Order_Grid_Collection::addItemsự miễn trừ này:

<?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
Đây không phải là một giải pháp, mà đơn giản là một cách để thoát khỏi thông báo lỗi.
Niels

1
Lỗi squashing không giống như sửa chúng, hãy xem xét thêm khác biệt vào kết quả bộ sưu tập của bạn hoặc nhóm truy vấn nối theo một trường.
DWils
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.