php - Doctrine 不允许 ResultSetMappingBuilder 工作

标签 php symfony doctrine doctrine-orm

我正在使用 Symfony 2 和 doctrine。我已经设置了一个带有自定义查找功能的自定义存储库。当它连接到子查询时,根据我所读到的内容,我非常确定我需要使用 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 上的 id 字段解决了 id 问题,但是我仍然有一个关于修改后的 joinedEntity 的问题:

    $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不太清楚,我不完全理解类文档 block 中的描述。

它给出的错误是:

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重命名模式,让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);

关于php - Doctrine 不允许 ResultSetMappingBuilder 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9580723/

相关文章:

php - PHP文件的真实URI?

php - PDO 在 PHP5.4 中将整数列作为字符串返回

使用 xdebug 的 PHPStorm 本地调试永远不会捕获并且无法验证

php - 如何使用我的服务将联系人导出到 CSV?

symfony - 如何从 Controller 访问Twig path()函数?

Symfony 2 和带有 yml 的数据库结构

php - Doctrine 1.2 保存记录关系 UPDATE 而不是 INSERT

javascript - Select2 与 collectionType - Symfony2

symfony - 如何用phpunit模拟依赖注入(inject)?

php - 流式传输大型 Doctrine 2 查询结果以输出