동일한 ID가 "xxx"이미 존재하는 "항목 (Mage_Catalog_Model_Product)을 수정하려면 어떻게해야합니까?


18

제품 컬렉션을 필터링하려고 할 때이 오류가 발생했습니다.

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist Magento 내부에 동일한 ID를 가진 (보이는) 제품이 하나만 있기 때문에 오류의 원인이 무엇인지 묻고 싶었습니다.

이 dupilcate를 제거하기 위해 지워야 할 테이블이 있습니까?


코드를 추가 할 수 있습니까? group by고유 한 제품 ID 만 얻으려면 사용해야 합니다. 참조 magento.stackexchange.com/questions/12773/...
Renon 스튜어트

@RS, 안녕, 나는 아직도 그것을 추적하자마자 다시 게시 할 원인을 찾으려고 노력하고 있습니다 ...
user1704524

답변:


36

distinct허용 된 답변에 제안 된대로 추가하면 문제가 해결되지만 성능 문제가 있습니다. 데이터베이스는 쿼리를 실행할 때 디스크에 임시 테이블을 만들 수 distinct있으며 이로 인해 요청 속도가 느려집니다. 대신 group컬렉션에 조건을 추가하여 중복을 제거 할 수 있습니다.

이 게시물을 살펴보십시오 . 그들이 한 일 (그리고 나는 또한 한 일)은 엔티티 ID별로 그룹화됩니다. 이것은 더 잘 수행됩니다.

//adding filters to the collection..

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

이 코드를 어디에 추가
해야하는지

@BabyinMagento는 어디서나 사용자 지정 코드에서 컬렉션을 사용하고 있습니다. 이 오류는 데이터베이스에서 콜렉션을 페치하는 사용자 정의 모듈을 작성할 때 발생합니다. 이는 최근에 타사 모듈을 설치 한 경우 표시 될 수 있음을 의미합니다. 이 경우, 오류의 위치를 ​​찾는 것은 상기 모듈의 개발자에게 달려 있습니다.
Vic

distinct()솔루션이 당신이 모르게 데이터가 손실 될 수 있습니다 수단 쿼리에서 추가 레코드를 제거합니다. 따라서 이것은 내 경우와 같이 최선의 해결책이 아닐 수도 있습니다. 이제 조인 된 테이블의 레코드를 컬렉션으로 가져 와서 같은 행에 두 레코드를 모두 그리드로 표시하는 방법을 찾으려고합니다.
Jacques

참고 사항 :이 컬렉션을 체인으로 연결하지 않는 것이 중요하지만 가장 중요한 것은 변수에 콜 레이션을 넣고 $ collection-> getSelect ()-> group ( 'e.entity_id');
Rickert

이 코드는 어디에서 업데이트 할 수 있습니까?
zus

7

일반적으로 이것은 데이터 또는 컬렉션 구현의 버그입니다.

보다 광범위한 문제에 대한 해결책은 다음과 같습니다. 이것은 임의의 컬렉션에서만 작동합니다.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>필요에 따라 .

참여 테이블을 하나씩 제거하여 쿼리를 분석하고 중복을 일으킨 레코드를 확인하십시오.

이 패치는 핵심에 있어야한다고 생각합니다.


3

문제는 동일한 제품이 컬렉션에 두 번로드되는 컬렉션 (조인 또는 유니온 포함)이 있다는 것입니다.

선택 오브젝트에 고유 한 메소드를 추가하여로드중인 콜렉션을 변경할 수 있습니다.

http://framework.zend.com/manual/1.12/en/zend.db.select.html을 참조 하십시오

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

그러나 이것은 본질적인 문제와 함께 온다. distinct를 사용하면 임시 테이블이 메모리가 아닌 디스크에 작성되어 성능이 저하됩니다.


0

나의 경우에는

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

작동하지 않습니다.

->getSelect()->group('main_table.entity_id');

매트도 하나도 he

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.