Я использую 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-запрос выполняется без проблем и возвращает результаты, которые я ожидал бы.
UPDATE, я исправил проблему с идентификацией, переназначив поле id в addRootEntityFromClassMetadata, но у меня все еще осталась проблема с пересмотренным объединенным элементом:
$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, которое я использовал для хранения массива.
При создании ResultSetMappingBuilder
укажите COLUMN_RENAMING_INCREMENT
переименования COLUMN_RENAMING_INCREMENT
для Doctrine для автоматического разрешения конфликтов
Затем в реальном запросе вам нужно использовать генератор select:
$rsm = new ResultSetMappingBuilder( $entityManager, ResultSetMappingBuilder::COLUMN_RENAMING_INCREMENT ); $rsm->addRootEntityFromClassMetadata("Product", "p"); $rsm->addJoinedEntityFromClassMetadata("ProductImage", "pi", "p", "images"); $query = $entityManager->createNativeQuery(" SELECT " . $rsm->generateSelectClause() . " FROM product p JOIN product_image pi ", $rsm);
Просто закрывая вопрос, как он решается:
Для тех, у кого такая же проблема, проблема связана с 4-м параметром, отправленным по этой строке:
$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'ducks');
Который должен был удерживать поле внутри класса Country, которое я использовал для хранения массива.