Php 原则2,提示\u强制\u部分\u加载不会获取连接的实体

Php 原则2,提示\u强制\u部分\u加载不会获取连接的实体,php,mysql,symfony,doctrine-orm,doctrine,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\Join

有一张优惠券:

/**
 * @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()
为空。。。虽然查看DQL,但leftjoin do仍会发生

如果我删除
->setHint(\Doctrine\ORM\Query::HINT\u FORCE\u PARTIAL\u LOAD,true))然后它工作正常。怎么回事?

对于如何使用该查询提示集加载相关对象(至少对我来说)并不十分清楚,比如在您的情况下:

Query::HINT\U FORCE\U PARTIAL\U LOAD-允许对对象进行水合物化,尽管并不是所有列都被提取。此查询提示可用于处理包含字符或二进制数据的大型结果集的内存消耗问题。条令无法隐式地重新加载这些数据。如果要从数据库完全重新加载部分加载的对象,则必须将其传递给EntityManager::refresh()

我猜您可以保留提示,但是您的DQL必须包含凭证的部分代码(
SELECT partial x.{courge\u id,name}…

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

对于如何使用该查询提示集加载相关对象(至少对我来说)不是非常清楚,比如在您的情况下:

Query::HINT\U FORCE\U PARTIAL\U LOAD-允许对对象进行水合物化,尽管并不是所有列都被提取。此查询提示可用于处理包含字符或二进制数据的大型结果集的内存消耗问题。条令无法隐式地重新加载这些数据。如果要从数据库完全重新加载部分加载的对象,则必须将其传递给EntityManager::refresh()

我猜您可以保留提示,但是您的DQL必须包含凭证的部分代码(
SELECT partial x.{courge\u id,name}…


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

谢谢,但事实证明我也需要查询联接表。所以:不仅仅是->选择(),而是->选择('v');但我将您标记为“已接受”,因为您是与我打交道的人:)谢谢,但结果证明我也需要查询联接表。所以:不仅仅是->选择(),而是->选择('v');但我把你标记为“接受”,因为你是和我打交道的人:)