2016-03-29 12 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またはbinaryデータを含む大きな結果セットでのメモリ消費の問題を処理できます。 Doctrineはこのデータを暗黙的にリロードする方法がありません。部分的に読み込まれたオブジェクトは、データベースから完全に再読み込みする場合、EntityManager :: refresh()に渡す必要があります。

ヒントはそのままですが、DQLにバウチャーの部分コード(SELECT partial x.{voucher_id, name}...)を含める必要があります。

最大の関連オブジェクトが常に独自のDQLでロードされている場合は、このクエリヒントを削除して、常に独自の部分クエリで読み込むことができます。通常は、カスタムリポジトリとDQLを使用してメモリ消費とパフォーマンスを最適化することを好みます。

+0

ありがとう、しかし、私は結合されたテーブルも照会する必要があることが判明しました。だから: - だけではなく - > select()BUT - > select( 'v');しかし、私はあなたが私と同意した人だったので、あなたは「受け入れられた」とマークしました:) –