Doctrine 仅从本机查询中水合物单行

Posted

技术标签:

【中文标题】Doctrine 仅从本机查询中水合物单行【英文标题】:Doctrine hydrate only single row from native query 【发布时间】:2015-11-24 11:44:58 【问题描述】:

这是我的映射:

$rsm = new ResultSetMapping;
$rsm->addEntityResult('OOHMediaBundle:OfferItem', 'i');
    $rsm->addFieldResult('i', 'reserved_at', 'reservedAt');

$rsm->addJoinedEntityResult('OOHMediaBundle:Offer', 'o', 'i', 'offer');
    $rsm->addFieldResult('o', 'o_id', 'id');
    $rsm->addFieldResult('o', 'continue_from', 'continueFrom');
    $rsm->addFieldResult('o', 'continue_to', 'continueTo');

这是我的原生查询:

$qb = $this->registry->getEntityManager()->createNativeQuery(
    'SELECT i.reserved_at, o.id AS o_id, o.continue_from, o.continue_to
    FROM offer_item AS i
    LEFT JOIN offers AS o ON i.offer_id = o.id
    WHERE i.reserved_at IS NOT NULL
    ;',
    $rsm
);

如果上面的 SQL 被复制到 mysql 客户端,它会产生 43 条记录。

当以$qb->getArrayResult(); 执行时,它只返回1 记录。

当以$qb->getResult(); 执行时,它会返回异常:

[Symfony\Component\Debug\Exception\ContextErrorException]  
Notice: Undefined index: offer_id 

其他42条记录在哪里消失了?

【问题讨论】:

你试过$qb->getResult(); 吗? 尝试将i.id 添加到字段结果中。据我记得AI 列也是必需的还要记住选择子句的顺序很重要,并且需要匹配addFieldResult() 中的顺序。 我在那个表中没有 id :( 它的 M2M 加入表没有 ids... @Artamiel 请将您的评论变成答案。这确实是我需要的。 (谢天谢地,还有其他各种原因还需要“id”!) 【参考方案1】:

好吧,正如我在评论中提到的,当使用ResultSetMapping 时,主要实体的Auto Increment 列需要在字段集结果中列出。以下内容也应适用于需要添加的每个连接子句,以便学说可以正确格式化结果。

使用addFieldResult() 添加的列的顺序必须与 RAW 查询中列出的顺序相同。

Doctrine 文档中的以下章节Examples 包含一些不错的示例供进一步参考。

【讨论】:

以上是关于Doctrine 仅从本机查询中水合物单行的主要内容,如果未能解决你的问题,请参考以下文章

使用Doctrine NativeQuery获取单行结果

什么是 Doctrine 水合作用? [关闭]

本机查询 - 如何仅从数据库中检索实体的特定列

如何在 Doctrine 2 中对本机查询进行分页?

使用 Doctrine2 从数组水合到对象

Doctrine Orm 2 使用本机 SQL 的递归查询