2016-03-29 41 views
1

有一個憑證:學說2,HINT_FORCE_PARTIAL_LOAD不會取指加盟實體

/** 
* @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,左連接確實發生。

如果我刪除->setHint(\Doctrine\ORM\Query::HINT_FORCE_PARTIAL_LOAD, true));那麼它工作正常。怎麼了?

回答

3

The documentation不是如何相關對象加載與查詢提示設置,像你的情況一清二楚(至少對我來說):

查詢:: HINT_FORCE_PARTIAL_LOAD - 允許滋潤,雖然不是所有的對象他們的列被提取。此查詢提示可用於處理包含char或二進制數據的大型結果集的內存消耗問題。學說無法隱式重新加載這些數據。部分加載的對象必須傳遞給EntityManager :: refresh(),如果它們要從數據庫完全重新加載。

我的猜測是你可以保持提示,但是你的DQL必須包含代金券的部分代碼(SELECT partial x.{voucher_id, name}...)。

如果您的最大相關對象始終用您自己的DQL加載,則可以刪除此查詢提示並始終使用您自己的部分查詢進行加載。通常我更喜歡使用定製存儲庫和DQL來優化內存消耗和性能。

+0

謝謝,但事實證明,我也需要查詢連接表。所以:不只是 - > select()BUT - > select('v');但是我把你標記爲「接受」,因爲你是與我交往的人:) –