2017-08-04 5 views
0

これは質問と私自身の答えです(私が偶然考え出した解決策)。 Laravelのドキュメンテーションはこれについて言及しておらず、それは私に数時間のプログラミング苦労をもたらしました。Laravel Eagerが内部の制約を読み込んでいても、 'with'がネストされている場合は制限されません

コメントと投票の投稿(コメント用)があるとします。ララベルの好例。モデルと関係はTextbook(Laravelのドキュメントから)です。投稿にはコメントがあり、コメントには投票があります。

ので、

$comments_ids = [1,6,7,22]; 

Post::where('id', $post_id) 
      ->with(['comments' => function($query) use ($comments_ids) { 
       $query->whereIn('id', $comments_ids); 
      }]) 
      ->with('comments.votes') 
      ->first(); 

だから、私は、IDSは1,6,7,22のあるコメントやロードされた熱心な票をポストを期待するべきです。

しかし、それほど速くはありません!私はすべてのコメントを得る!それらのすべて! ...なぜ?我々熱心な負荷コメントは、その後、我々は票をロードし、ので

、投票をロードするために、すべてのコメントを強制的に:ここで

答えて

0

はその質問への答えです。

この:

$comments_ids = [1,6,7,22]; 

Post::where('id', $post_id) 
      ->with(['comments' => function($query) use ($comments_ids) { 
       $query->whereIn('id', $comments_ids); 
      }]) 
      ->with('comments.votes') //this forces Builder to completely ignore whereIn clause above. 
      ->first(); 

には、以下のように記述する必要があります。

$comments_ids = [1,6,7,22]; 

Post::where('id', $post_id) 
      ->with(['comments' => function($query) use ($comments_ids) { 
       $query->whereIn('id', $comments_ids) 
         ->with('votes'); //eager load votes with filtered comments 
      }]) 
      ->first(); 

その後、あなたは$ comments_ids変数で指定されたIDのコメントを取得します。そして、熱心に票を集めて投票しました。

この小さなニュアンスは多くの頭痛を引き起こしました。

関連する問題