製品コレクションをフィルタリングしようとすると、このエラーが発生しました
Item (Mage_Catalog_Model_Product) with the same id "6058" already exist
Magento内に同じIDを持つ(表示される)製品は1つしか存在しないため、エラーの原因を尋ねる必要がありました。
この重複を削除するためにクリアする必要があるテーブルはありますか?
製品コレクションをフィルタリングしようとすると、このエラーが発生しました
Item (Mage_Catalog_Model_Product) with the same id "6058" already exist
Magento内に同じIDを持つ(表示される)製品は1つしか存在しないため、エラーの原因を尋ねる必要がありました。
この重複を削除するためにクリアする必要があるテーブルはありますか?
回答:
distinct
受け入れられた答えで提案されているように追加すると問題は解決しますが、パフォーマンスの問題があります。データベースは、クエリの実行時にディスク上に一時テーブルを作成する場合がdistinct
あり、これによりリクエストが遅くなります。代わりgroup
に、コレクションに条件を追加して、重複を削除できます。
この投稿を見てください。彼らがやったこと(そして私もやったこと)は、エンティティIDによるグループ化です。これにより、パフォーマンスが向上します。
//adding filters to the collection..
$collection->getSelect()
->group('e.entity_id');
distinct()
ソリューションこれはあなたが気づかず、データを失う可能性がある手段、クエリから任意の追加のレコードを削除します。私の場合のように、これは最善の解決策ではないかもしれません。私は、グリッドの同じ行に両方のレコードを表示できるように、結合されたテーブルからコレクションに両方のレコードを取得する方法を見つけようとしています。
通常、これはデータまたはコレクションの実装のバグです。
以下は、より広範な問題の解決策です。これは、だけでなく、任意のコレクションでも機能しCatalog_Model_Product
ます。
ステップ1.変更し、コア・ファイルlib/Varien/Data/Collection.php
、function 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つずつ削除するクエリを分析し、どのレコードが重複を引き起こしたかを確認します。
このパッチはコアにあるべきだと思います。
問題は、同じ製品がコレクションに2回ロードされる結果となるコレクション(おそらく結合またはユニオンを持つ)があることです。
selectオブジェクトに個別のメソッドを追加することにより、ロードされるコレクションを変更できます。
http://framework.zend.com/manual/1.12/en/zend.db.select.htmlを参照してください
$db->select()
->distinct()
しかし、これには固有の問題が伴います。distinctを使用すると、メモリ内ではなくディスク上に一時テーブルが作成され、パフォーマンスが低下します。
私の場合
->getSelect()->group('e.entity_id');
使用していない
->getSelect()->group('main_table.entity_id');
誰かのためにも頑張ってください
group by
一意の製品IDのみを取得するために使用する必要があります。magento.stackexchange.com/questions/12773/を