Doctrine水合物只能从原生查询中单行

时间:2015-11-24 11:44:59

标签: symfony doctrine-orm doctrine-native-query

这是我的映射:

$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 记录何时消失?

1 个答案:

答案 0 :(得分:2)

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

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

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