Doctrine não permite que ResultSetMappingBuilder funcione
Estou usando o Symfony 2 com doutrina. Eu configurei um repositório personalizado com uma função de localização personalizada. À medida que se junta a uma subconsulta, tenho certeza do que li que precisarei usar o ResultSetMappingBuilder para recuperar os resultados da consulta. Mas continuo recebendo o seguinte erro:
The column 'id' conflicts with another column in the mapper.
Meu código é:
$sql ="SELECT c.id as cid, c.country, c.rank, c.continent, q.*
FROM country c
INNER JOIN (
SELECT d.* , MAX( d.rating ) AS maxrating
FROM ducks d
GROUP BY d.country_id
)q ON ( q.country_id = c.id )";
$rsm = new \Doctrine\ORM\Query\ResultSetMappingBuilder($this->getEntityManager());
$rsm->addRootEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Country', 'c', array('id' => 'cid'));
$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'country_id');
$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
return $query->getResult();
A consulta SQL é executada por si própria, sem problemas e retorna os resultados que eu esperari
UPDATE, eu corrigi o problema de identificação remapeando o campo de identificação no addRootEntityFromClassMetadata, mas ainda tenho um problema restante com o joinEntity revisado:
$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'country_id');
Estou tendo o erro a seguir
Notice: Undefined index: country_id in E:\Documents\wfuk\Work\duck travels\wamp\vendor\doctrine\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php line 85
Tenho certeza de que esse é o último valor da chamada, country_id, mas não tenho 100% de certeza do que é isso. A explicação aqui:http: //readthedocs.org/docs/doctrine-orm/en/latest/reference/native-sql.htm não é muito claro e não entendo completamente a descrição da classe docbloc
O erro que dá é:
The column 'id' conflicts with another column in the mapper.
No entanto, renomeei o campo id para um dos resultados, portanto o conjunto de resultados possui apenas uma coluna chamada 'id'
O stacktrace no erro mostra que está sendo lançado aqui:
at ResultSetMappingBuilder ->addAllClassFields ('Wfuk\DuckBundle\Entity\Ducks', 'q', array())
in E:\Documents\wfuk\Work\duck travels\wamp\vendor\doctrine\lib\Doctrine\ORM\Query\ResultSetMappingBuilder.php at line 71
Suspeito que seja algo óbvio, mas não há muita documentação sobre essa função que eu possa encontrar em qualquer lugar ...
SOLVED:
Não posso adicionar isso como resposta por mais 5 horas; portanto, para evitar que alguém perca tempo respondendo a isso, a resposta é:
Para quem tem o mesmo problema, o problema foi com o quarto parâmetro enviado nesta linha:
$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'ducks');
Que deveria ter mantido o campo dentro da classe Country que eu estava usando para armazenar a arrayCollection de patos nela.