Doctrine hydrate 仅来自本机查询的单行
Doctrine hydrate only single row from 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();
执行时,它只有return 1条记录。
当作为 $qb->getResult();
执行时,它 return 异常:
[Symfony\Component\Debug\Exception\ContextErrorException]
Notice: Undefined index: offer_id
其他 42 条记录在哪里消失了?
好的,正如我在评论中提到的,当使用 ResultSetMapping
时,主要实体的 Auto Increment
列需要列在字段集结果中。以下内容还应适用于需要添加的每个连接子句,以便学说可以正确格式化结果。
添加 addFieldResult()
的列的顺序必须与 RAW 查询中列出的顺序相同。
Doctrine 文档中的下一章 Examples 包含一些不错的示例以供进一步参考。
这是我的映射:
$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();
执行时,它只有return 1条记录。
当作为 $qb->getResult();
执行时,它 return 异常:
[Symfony\Component\Debug\Exception\ContextErrorException]
Notice: Undefined index: offer_id
其他 42 条记录在哪里消失了?
好的,正如我在评论中提到的,当使用 ResultSetMapping
时,主要实体的 Auto Increment
列需要列在字段集结果中。以下内容还应适用于需要添加的每个连接子句,以便学说可以正确格式化结果。
添加 addFieldResult()
的列的顺序必须与 RAW 查询中列出的顺序相同。
Doctrine 文档中的下一章 Examples 包含一些不错的示例以供进一步参考。