同じID「X」を持つアイテム(Mage_Sales_Model_Order)は既に存在します


12

Magentoの管理領域でシップメントを作成した後var/report、管理者注文グリッドページを表示すると、次のエラーがフォルダーに表示されます(デフォルトのMagentoクラッシュページの後)。

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

DISTINCT句を662 app/code/core/Mage/Eav/Model/Entity/Collection/Abstact.php行目のvarienオブジェクトセレクターに追加することで、このエラーを取り除くことができます。しかし、いくつかの理由(クエリが非常に遅い、コアファイルを編集するなど)でそれをしたくありません。

データの整合性を維持しながらこれを解決する最良の方法は何ですか。注文を削除する必要がありますか?建設的なインプット、特にそもそもこの競合の原因となるものについて感謝します。ありがとう。

-編集-

わかりやすくするため/私の愚かさを指摘するための完全なスタックトレースを次に示します。

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コードを含めることができますか?
スケシニ14年

回答:


10

コレクションに何かを追加すると、クエリ結果に重複が追加されます。

magentoがクエリ結果で行うことは、各行からオブジェクトを生成し、これらのアイテムをコレクションに追加することです。アイテムが既に存在する場合、このエラーがスローされます。

解決策:追加した結合に関係なく、結果が明確であることを確認してください。

のフィールドの横にさらにフィールドを追加した場合sales_flat_order、これらのフィールドは異なる可能性があるため、でフィルターされたノートDISTINCTです。


6

まだコメントを追加できなかったため、回答を追加しています。私は@fabianに同意しますがDISTINCT、との使用はお勧めしませんGROUP BY。通常、正しく計画すれば、結合を1つの明確な結果にフィルターできます。

例(これは簡単な例です):

を使用sales/flat_orderして注文を収集し、顧客の住所に参加した場合、請求先住所配送先住所の2つのレコードが保存されます。この問題を解決するために、参加するアドレスのタイプを指定できます。

これはあなたの状況に似ていますが、このシナリオではありません。


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エンティティタイプを作成したときに同様の問題に直面し、エンティティの1つを編集するまですべてが正常に機能しました。どういうわけか、編集の結果、エンティティのテキスト属性の1つ、つまり、同じエンティティの同じ属性のテキスト値テーブルの2つの行の値が重複しました。custom_entityテーブルのみの生のクエリは、重複することなく完全に正常に見えました(主キー制約はすでに整合性を保証していました)。

コレクションをロードするときにすでに推測したように、データベースから行を取得するために使用される結合と、エンティティの同じ属性に2つの同じテキスト値があることを考慮して、同じentity_id値で異なるの2つの行を取得しましたvalue_id

一般的なルールとして、このようなエラーが発生した場合、データベース内のデータが既に破損しているか、最終クエリで行われる結合がデータベースからほぼ正確に2つの行を取得し、コレクションの一意の識別子を複製することを疑う必要がありますアイテム。

お役に立てれば。

PS:私の場合、重複したeavテキスト値の理由については、マリウスのコメントをここでチェックしてください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();

問題を解決するために-> group( 'entity_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
スカッシュエラーは修正と同じではありません。コレクション結果に個別に追加するか、フィールドごとに結合クエリをグループ化することを検討してください。
DWils
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.