同じID「xxx」がすでに存在する「Item(Mage_Catalog_Model_Product)」を修正するにはどうすればよいですか?


18

製品コレクションをフィルタリングしようとすると、このエラーが発生しました

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist Magento内に同じIDを持つ(表示される)製品は1つしか存在しないため、エラーの原因を尋ねる必要がありました。

この重複を削除するためにクリアする必要があるテーブルはありますか?


コードを追加できますか?group by一意の製品IDのみを取得するために使用する必要があります。magento.stackexchange.com/questions/12773/を
レノンスチュワート

@RSは、こんにちは、私はまだ...私はできるだけ早く私はそれを追跡として戻って投稿します原因を見つけようとしています
user1704524

回答:


36

distinct受け入れられた答えで提案されているように追加すると問題は解決しますが、パフォーマンスの問題があります。データベースは、クエリの実行時にディスク上に一時テーブルを作成する場合がdistinctあり、これによりリクエストが遅くなります。代わりgroupに、コレクションに条件を追加して、重複を削除できます。

この投稿を見てください。彼らがやったこと(そして私もやったこと)は、エンティティIDによるグループ化です。これにより、パフォーマンスが向上します。

//adding filters to the collection..

$collection->getSelect()
           ->group('e.entity_id');

このコードを追加する必要がある場所を教えてください
Baby in Magento

@BabyinMagentoは、カスタムコードでコレクションを使用している場所です。このエラーは、データベースからコレクションを取得するカスタムモジュールを作成するときに発生します。これは、サードパーティのモジュールを最近インストールした場合に表示される可能性があることを意味します。その場合、エラーの場所を見つけるのは、上記モジュールの開発者次第です。
ヴィック

distinct()ソリューションこれはあなたが気づかず、データを失う可能性がある手段、クエリから任意の追加のレコードを削除します。私の場合のように、これは最善の解決策ではないかもしれません。私は、グリッドの同じ行に両方のレコードを表示できるように、結合されたテーブルからコレクションに両方のレコードを取得する方法を見つけようとしています。
ジャック

ちょっとした注意:これをコレクションに連鎖させないための重要な点は、最初にコレクションを変数に置き、$ collection-> getSelect()-> group( 'e.entity_id');
リッカート

このコードはどこで更新できますか?
ZUS

7

通常、これはデータまたはコレクションの実装のバグです。

以下は、より広範な問題の解決策です。これは、だけでなく、任意のコレクションでも機能しCatalog_Model_Productます。

ステップ1.変更し、コア・ファイルlib/Varien/Data/Collection.phpfunction addItem()しかし、とは違って、この答えは示唆して、エラーを非表示にしないでください。

代わりに、スローされた例外に追加のエラー情報を追加します。

        if (isset($this->_items[$itemId])) {
            throw new Exception('Item ('.get_class($item).
                ') with the same id "'.$item->getId().'" already exist' .
                '. SQL that caused this: ' . $this->getSelect());
        }

手順2.エラーレポートから問題のあるクエリを取得し、手動で実行します。コレクションキーと重複しているレコードを確認します。order by <key field>必要に応じて追加します。

参加しているテーブルを1つずつ削除するクエリを分析し、どのレコードが重複を引き起こしたかを確認します。

このパッチはコアにあるべきだと思います。


3

問題は、同じ製品がコレクションに2回ロードされる結果となるコレクション(おそらく結合またはユニオンを持つ)があることです。

selectオブジェクトに個別のメソッドを追加することにより、ロードされるコレクションを変更できます。

http://framework.zend.com/manual/1.12/en/zend.db.select.htmlを参照してください

$db->select()
         ->distinct()

しかし、これには固有の問題が伴います。distinctを使用すると、メモリ内ではなくディスク上に一時テーブルが作成され、パフォーマンスが低下します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.