Доктрина, не позволяющая ResultSetMappingBuilder работать - PullRequest
6 голосов
/ 06 марта 2012

Я использую 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.

Ответы [ 2 ]

12 голосов
/ 27 июля 2016

При создании 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);
0 голосов
/ 06 марта 2012

Просто закрываем вопрос, как он решен:

Для тех, у кого такая же проблема, проблема была с 4-м параметром, отправленным в этой строке:

$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'ducks');

Который должен был содержать поле в классе Country, который я использовал для хранения массива Collection of ducks внутри него.

...