Doctrine不允许ResultSetMappingBuilder工作

Al_*_*Al_ 6 php doctrine symfony doctrine-orm

我正在使用Symfony 2和学说.我已经设置了一个带有自定义查找功能的自定义存储库.当它加入子查询时,我非常肯定从我读过的内容中我需要使用ResultSetMappingBuilder从查询中获取结果.但我不断收到以下错误:

The column 'id' conflicts with another column in the mapper. 
Run Code Online (Sandbox Code Playgroud)

我的代码是:

    $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();
Run Code Online (Sandbox Code Playgroud)

SQL查询在它自己运行时没有任何问题,并返回我期望的结果.

更新,我已经通过重新映射addRootEntityFromClassMetadata上的id字段修复了id问题,但我仍然遇到修改后的joinedEntity的问题:

    $rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'country_id');
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Notice: Undefined index: country_id in E:\Documents\wfuk\Work\duck travels\wamp\vendor\doctrine\lib\Doctrine\ORM\Internal\Hydration\ObjectHydrator.php line 85 
Run Code Online (Sandbox Code Playgroud)

我很确定这是调用中的最后一个值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. 
Run Code Online (Sandbox Code Playgroud)

然而,我已经为其中一个结果重命名了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
Run Code Online (Sandbox Code Playgroud)

我怀疑这是显而易见的事情,但我在任何地方都找不到关于这个功能的文档.

解决了:

我不能将此作为另外5个小时的答案添加,所以为了避免任何人浪费时间回答这个问题,答案是:

对于遇到相同问题的任何人,问题在于此行发送的第4个参数:

$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'ducks');
Run Code Online (Sandbox Code Playgroud)

哪个应该在Country类中保存该字段,我用它来存储其中的ducks arrayCollection.

Ale*_*ski 15

为Doctrine 创建ResultSetMappingBuilder指定COLUMN_RENAMING_INCREMENT重命名模式以自动解决冲突

然后在实际查询中,您需要使用select generator:

    $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);
Run Code Online (Sandbox Code Playgroud)


Al_*_*Al_ -2

只是在问题解决后结束它:

对于任何有同样问题的人来说,问题出在这一行发送的第四个参数上:

$rsm->addJoinedEntityFromClassMetadata('Wfuk\DuckBundle\Entity\Ducks', 'ducks', 'c', 'ducks');
Run Code Online (Sandbox Code Playgroud)

它应该包含 Country 类中的字段,我用它来存储鸭子的 arrayCollection。

  • 我有同样的问题,但不太明白你的答案。 (10认同)
  • 请改进答案,以便对其他人有用。 (3认同)