Доктрина, не позволяющая ResultSetMappingBuilder работать

Я использую 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 уток внутри него.

Ответы на вопрос(2)

ResultSetMappingBuilder указыватьCOLUMN_RENAMING_INCREMENTрежим переименования для Doctrine для автоматического разрешения конфликтов

Тогда в реальном запросе вам нужно использовать генератор выбора:

    $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, который я использовал для хранения arrayCollection уток внутри него.

 Tim Lieberman06 мая 2014 г., 17:43
У меня та же проблема, но я не совсем понимаю ваш ответ.
 marcosdsanchez03 февр. 2016 г., 23:43
Пожалуйста, улучшите ответ, чтобы он мог быть полезен другим.

Ваш ответ на вопрос