2017-09-12 8 views
0

を使用して、私は、しかし、私は以下を行う際に、積極的なロードを使用して関係を最適化し、積極的なロードのための句とで条件を実装しようとしています:Laravel条件

$totalOpenQry = Enquiry::whereIn('staff_id', $employeeIds) 
      ->with(['enquiryStats' => function ($query) { 
       $query->where('is_open','=',true) 
        ->where('is_dead','=',false) 
        ->orderBy('id','asc'); 
      }]) 
      ->where('ed_timestamp', '>=', $dateRange['start']) 
      ->with('country'); 

     $totalOpen = $totalOpenQry->toSql(); 

$ totalOpenQry-を> toSql()

は、次のように生成します。

'select * from `enquiries` where `staff_id` in (10, 15) and `ed_timestamp` >= '2017-09-12'; 

それは思えます私のwith節のwhere条件を無視しています。これを修正したり、正しく実装する方法はありますか?

おかげ

+0

どのlaravelバージョンを使用していますか? –

+0

リレーションシップは同じクエリで読み込まれません。熱心なローディングは、まだローを追加するクエリではなく、データをロードする追加のクエリを実行します。 – Devon

+0

Laravelを使用して5.3。 @Devon、私はと一緒に使用して熱心な負荷の関係ができると思った?私の結果はis_openとis_closedを無視しているようです。 – liamjnorman

答えて

2

whereHas()は基本的にhas()と同じように動作しますが、あなたは確認するために、関連するモデルのための追加のフィルタを指定することができます。

$totalOpenQry = Enquiry::whereIn('staff_id', $employeeIds) 
     ->with('enquiryStats') 
     ->whereHas('enquiryStats', function ($query) { 
      $query->where('is_open','=',true) 
       ->where('is_dead','=',false) 
       ->orderBy('id','asc'); 
     }) 
     ->where('ed_timestamp', '>=', $dateRange['start']) 
     ->with('country'); 
// only enquiryStats that have is_open = true and is_dead = false are returned 
+0

ここでは、コードベースごとのパラメータを受け入れる[ref link](https://stackoverflow.com/questions/43174190/laravel-where-selection-for-eloquent-eager-loading-relationship) –

+0

これが何を行うかについての説明を追加し、私はそれをupvoteよ。 – Devon

+1

これは私の問題を解決しました。ありがとう@ Mr.Pyramid – liamjnorman

1

あなたは2のクエリを取得します:

1: 'select * from `enquiries` where `staff_id` in (10, 15) and `ed_timestamp` >= '2017-09-12'; 

2 Something like: 'select * from `stats` where `staff_id` in (10, 15) AND `is_open`=true...; 

しかし->toSql()は最初のみ表示されます。

+0

おそらく私は誤解しているかもしれませんが、私はそれが私の結果セットを制限するように同じクエリである必要がありますか? – liamjnorman

+0

@liamjnormanお問い合わせや統計情報を拘束しようとしていますか? – Devon

+0

関連するenquiryStatsで照会をロードしようとしていて、enquiryStatsに基づいて取得した照会の数を制限しています。 – liamjnorman