Я использую Symfony 2 с доктриной.Я создал собственный репозиторий с пользовательской функцией поиска.Поскольку он присоединяется к подзапросу, я почти уверен в том, что прочитал, что мне нужно использовать ResultSetMappingBuilder, чтобы получить результаты из запроса.Но я продолжаю получать следующую ошибку:
The column 'id' conflicts with another column in the mapper.
Мой код:
$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();
SQL-запрос выполняется без каких-либо проблем и возвращает ожидаемые результаты.
ОБНОВЛЕНИЕ, я исправил проблему с идентификатором, переназначив поле идентификатора на addRootEntityFromClassMetadata, но у меня все еще осталась проблема с пересмотренным joinEntity:
$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'country_id');
Я получаюследующая ошибка:
Notice: Undefined index: country_id in E:\Documents\wfuk\Work\duck travels\wamp\vendor\doctrine\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php line 85
Я почти уверен, что это до последнего значения в вызове country_id, но я не уверен на 100%, что это.Объяснение здесь: http://readthedocs.org/docs/doctrine-orm/en/latest/reference/native-sql.html не слишком ясно, и я не полностью понимаю описание из класса docblock.
Ошибка, которую это дает:
The column 'id' conflicts with another column in the mapper.
И все же я переименовал поле id для одного из результатов, поэтому в наборе результатов есть только один столбец с именем 'id'.
Трассировка стека по ошибке показывает, что она выдается здесь:
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
Я подозреваю, что это что-то очевидное, но есть немного документации по этой функции, которую я мог бы найти где-либо ...
РЕШЕНО:
Я не могудобавьте это в качестве ответа еще на 5 часов, чтобы никто не потратил впустую время, отвечая на этот вопрос:
Для тех, у кого возникла такая же проблема, проблема была с 4-м параметром, отправленным в этой строке:
$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'ducks');
Который должен был содержать поле в классе Country, который я использовал для хранения в нем arrayCollection ducks.