Como posso corrigir o "Item (Mage_Catalog_Model_Product) com o mesmo ID" xxx "já existe"?


18

Estou recebendo esse erro ao tentar filtrar uma coleção de produtos

Item (Mage_Catalog_Model_Product) with the same id "6058" already exist e queria perguntar o que poderia causar o erro, uma vez que existe apenas um produto (visível) com o mesmo ID no Magento.

Existe uma tabela que precise ser limpa para remover esse dupilcate?


Você pode adicionar algum código? Você precisa usar group bypara obter apenas o ID do produto exclusivo. Veja magento.stackexchange.com/questions/12773/…
Renon Stewart

@RS, Oi, eu estou ainda tentando encontrar a causa Vou postar de volta logo que eu rastreá-lo ...
user1704524

Respostas:


36

Adicionar o distinctsugerido na resposta aceita corrige o problema, mas há problemas de desempenho. O banco de dados pode criar tabelas temporárias no disco durante a execução de uma consulta distincte isso atrasará sua solicitação. Você pode adicionar uma groupcondição à coleção para remover duplicatas.

Dê uma olhada neste post . O que eles fizeram (e eu também fiz) é agrupar pelo ID da entidade. Isso deve ter um desempenho melhor.

//adding filters to the collection..

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

você pode por favor dizer onde precisamos adicionar este código
Bebê em Magento

@BabyinMagento onde quer que esteja, você está usando sua coleção em seu código personalizado. Este erro ocorre ao criar módulos personalizados que buscam coleções no banco de dados. Isso significa que poderá aparecer se você instalou módulos de terceiros recentemente. Nesse caso, cabe ao desenvolvedor do referido módulo encontrar a localização do erro.
Vic

A distinct()solução e isso removerão quaisquer registros adicionais da consulta, o que significa que você pode perder dados sem perceber. Portanto, essa pode não ser a melhor solução, como no meu caso. Agora estou tentando encontrar uma maneira de obter os dois registros da minha tabela unida na coleção para que eu possa mostrar os dois registros na mesma linha da grade.
Jacques

Nota: é importante não encadear isso na coleção, mas antes coloque sua coleção em uma variável e depois $ collection-> getSelect () -> group ('e.entity_id');
Rickert

onde posso atualizar esse código?
zus

7

Normalmente, esse é um erro nos dados ou na implementação da coleção.

Aqui está uma solução para um problema mais amplo. Isso funciona na coleção arbitrária, não apenas para Catalog_Model_Product.

Etapa 1. Modificar o arquivo de núcleo lib/Varien/Data/Collection.php, function addItem()mas, ao contrário esta resposta sugere, não escondem o erro.

Em vez disso, adicione informações de erro extras à exceção lançada:

        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());
        }

Etapa 2. Pegue a consulta incorreta do seu relatório de erros e execute-a manualmente. Veja quais registros duplicam a chave de coleção. Adicione order by <key field>conforme necessário.

Dissecar a consulta removendo as tabelas participantes uma por uma e ver qual registro causou a duplicação.

Eu acredito que este patch deve estar no centro.


3

Seu problema é que você tem uma coleção (provavelmente com uma associação ou união) que está resultando no carregamento do mesmo produto duas vezes na coleção.

Você pode alterar a coleção que está sendo carregada adicionando um método distinto ao objeto selecionado.

Consulte http://framework.zend.com/manual/1.12/en/zend.db.select.html

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

Mas isso vem com problemas inerentes. O uso de distinct fará com que tabelas temporárias sejam criadas no disco, e não na memória, com penalidades de desempenho.


0

No meu caso

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

não funciona eu uso:

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

Mat ser hejpful para alguém também

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.