2016-11-29 15 views
5

:両方のアプローチにlaravel 5クエリを複数の制約

//Example Data; 
$date = Carbon::now(); 
$order = 'name'; // it can be by name, id or created_at; 

// Approach i try for getting data of user with eager loaded products 

//1st approach 
$user = User::with([ 
    'products' => function ($query) use ($date, $order) { 
     $query->where('created_at', $date)->orderBy($order, 'desc'); 
    }, 
])->get(); 

//2nd approach 
$user = User::with([ 
    'products' => function ($query) use ($date, $order) { 
     $query->where('created_at', $date); 
     $query->orderBy($order, 'desc'); 
    }, 
])->get(); 

は、クエリの唯一の第一条件が読み込まれています。

私は熱心なロードされたデータにフィルタを適用する where()句と orderByを作りたいです。

私は何かしていますか?それを間違ってコード化していますか?

+0

の可能性のある重複した[WHERE句のクエリがLaravel雄弁を使用して複数を作成する方法?](http://stackoverflow.com/questions/19325312/how-to-create-multiple-where-clause-query-using -laravel-eloquent) – Veerendra

+0

@Veerendraいいえ、タイトルをよく読んでください。 – Jefsama

+0

まず第一のアプローチと第二のアプローチは同じ意味を持ちます。書き込むパターンが異なるだけです。二番目に、両方のアプローチで二番目のwhere節を試したことさえありません。 2番目のwhere句に試したコードを投稿してください。例:$ users = User :: with(配列( 'posts' => function($ query、$ title){$ query-> where( 'title'、 '='、$ title);}の例を参照してください) => function($ query){$ query-> where( 'tag_type'、 '='、 'admin')} ))> get(); – Veerendra

答えて

1

where()条件にクロージャを追加することで問題を解決しました。

$user = User::with([ 
    'products' => function ($query) use ($date, $order) { 
     $query->where(function ($q) use ($date, $order) { 
      $q->where('created_at', $date); //This can accept more where() condition 
     })->orderBy($order,'DESC'); 
    }])->get(); 
4

ネストされたeager loadingを使用してみてください。いくつかのようなもの:

$user = User::with([ 
    'products' => function ($query) use ($date) { 
      $query->where('created_at', $date); 
     },'products.order' =>function ($query) use ($order) { 
      $query->orderBy($order, 'desc'); 
     } 
    ])->get(); 
2

あなたの注文は "サブクエリー"で作られていることです。 laravelがjoin(これは熱心な読み込みです)を実行すると、order_byはあなたに関連しません。

有用な解決策は、laravelによって提供されるエイリアスを使用して、クエリの外側にorderby句を使用することだと思います。

$user = User::with([ 'products' => function ($query) use ($date, $order) { $query->where('created_at', $date)->orderBy($order, 'desc'); }, ])->orderBy("$laravel_join_generated_alias.$order", 'desc')->get(); ここで$laravel_join_generated_aliasdebugbarを使用すると、この文字列の動作を確認できます。

2

あなたの説明として、両方のアプローチがうまくいきます。

Userモデルに->orderBy()を使用するスコープはありますか?そのため、orderBy()はクロージャーが混乱しています。

dd($query->toSql())(封鎖あり)が役に立つかもしれません。