有一张优惠券:
/**
* @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;
如果我在voucherCode上执行查询构建器并添加$qb->leftJoin('x.voucher', 'v');
,那么它将不会查询凭证,->getVoucher()
为NULL ...虽然查看了DQL,但是确实发生了leftjoin。
如果我删除->setHint(\Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, true));
,那么它可以正常工作。怎么回事?
答案 0 :(得分:3)
The documentation并不是很清楚(至少在我看来),就像你的情况一样:
Query :: HINT_FORCE_PARTIAL_LOAD - 允许水合对象,尽管并非所有列都被提取。此查询提示可用于处理包含char或二进制数据的大型结果集的内存消耗问题。 Doctrine无法隐式重新加载这些数据。如果要从数据库中完全重新加载,则必须将部分加载的对象传递给EntityManager :: refresh()。
我的猜测是你可以保持提示,但是你的DQL必须包含凭证的部分代码(SELECT partial x.{voucher_id, name}...
)。
如果您最大的相关对象始终使用您自己的DQL加载,则可以删除此查询提示并始终使用您自己的部分查询加载。通常我更喜欢使用自定义存储库和DQL来优化内存消耗和性能。