제품 컬렉션을 필터링하려고 할 때이 오류가 발생했습니다.
Item (Mage_Catalog_Model_Product) with the same id "6058" already exist
Magento 내부에 동일한 ID를 가진 (보이는) 제품이 하나만 있기 때문에 오류의 원인이 무엇인지 묻고 싶었습니다.
이 dupilcate를 제거하기 위해 지워야 할 테이블이 있습니까?
제품 컬렉션을 필터링하려고 할 때이 오류가 발생했습니다.
Item (Mage_Catalog_Model_Product) with the same id "6058" already exist
Magento 내부에 동일한 ID를 가진 (보이는) 제품이 하나만 있기 때문에 오류의 원인이 무엇인지 묻고 싶었습니다.
이 dupilcate를 제거하기 위해 지워야 할 테이블이 있습니까?
답변:
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>
필요에 따라 .
참여 테이블을 하나씩 제거하여 쿼리를 분석하고 중복을 일으킨 레코드를 확인하십시오.
이 패치는 핵심에 있어야한다고 생각합니다.
문제는 동일한 제품이 컬렉션에 두 번로드되는 컬렉션 (조인 또는 유니온 포함)이 있다는 것입니다.
선택 오브젝트에 고유 한 메소드를 추가하여로드중인 콜렉션을 변경할 수 있습니다.
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');
매트도 하나도 he
group by
고유 한 제품 ID 만 얻으려면 사용해야 합니다. 참조 magento.stackexchange.com/questions/12773/...