Я использую 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, но у меня все еще остается проблема с исправленным соединениемEntity:
$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 не слишком понятно, и я не совсем понимаю описание из докблок класса.
Ошибка, которую он выдает:
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, которое я использовал для хранения массива уток внутри него.