Doctrine 2,HINT_FORCE_PARTIAL_LOAD不会获取已连接的实体

时间:2016-03-29 14:45:49

标签: php mysql symfony doctrine-orm doctrine

有一张优惠券:

/**
 * @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));,那么它可以正常工作。怎么回事?

1 个答案:

答案 0 :(得分:3)

关于如何使用该查询提示集加载相关对象,

The documentation并不是很清楚(至少在我看来),就像你的情况一样:

  

Query :: HINT_FORCE_PARTIAL_LOAD - 允许水合对象,尽管并非所有列都被提取。此查询提示可用于处理包含char或二进制数据的大型结果集的内存消耗问题。 Doctrine无法隐式重新加载这些数据。如果要从数据库中完全重新加载,则必须将部分加载的对象传递给EntityManager :: refresh()。

我的猜测是你可以保持提示,但是你的DQL必须包含凭证的部分代码(SELECT partial x.{voucher_id, name}...)。

如果您最大的相关对象始终使用您自己的DQL加载,则可以删除此查询提示并始终使用您自己的部分查询加载。通常我更喜欢使用自定义存储库和DQL来优化内存消耗和性能。