有一张优惠券:
/**
* @ORM\OneToMany(targetEntity="VoucherCode", mappedBy="voucher")
*/
protected $voucherCode;
和凭证代码:
/**
* @var \Doctrine\Entity\Voucher
*
* @ORM\ManyToOne(targetEntity="Doctrine\Entity\Voucher", inversedBy="voucherCode")
* @ORM\JoinColumn(name="voucher_id", referencedColumnName="id")
*/
protected $voucher;
如果我对凭证代码执行查询生成器并添加
$qb->leftJoin('x.voucher', 'v');
则它不会查询凭证,->getVoucher()
为空。。。尽管查看了DQL,但仍会发生leftjoin do。如果我删除
->setHint(\Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, true));
则它可以正常工作。怎么了? 最佳答案
The documentation对于如何使用该查询提示集加载相关对象(至少对我而言)不是很清楚,就像在您的情况下一样:
查询:HunthFieldPrimalLoad加载-允许水合物对象,虽然不是所有的列都被提取。此查询提示可用于处理包含字符或二进制数据的大型结果集的内存消耗问题。条令无法含蓄地重新加载这些数据。如果要从数据库中完全重新加载部分加载的对象,则必须将其传递给EntityManager::refresh()。
我的猜测是,您可以保持提示,但您的DQL必须包含凭证的部分代码(SELECT partial x.{voucher_id, name}...
)。
如果最大的相关对象总是用自己的DQL加载,那么可以删除此查询提示并总是用自己的部分查询加载。通常我更喜欢使用自定义存储库和DQL来优化内存消耗和性能。
关于php - Doctrine 2,HINT_FORCE_PARTIAL_LOAD不会获取连接的实体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36287642/