2016-11-29 50 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(); 

在這兩個辦法,只有1號條件的查詢被讀取。

我要讓 where()條款和 orderBy在渴望加載的數據進行過濾。

有什麼我錯過了嗎?我的代碼錯了嗎?

+0

的可能的複製[如何創建多個地方使用的子句查詢Laravel雄辯?](http://stackoverflow.com/questions/19325312/how-to-create-multiple-where-clause-query-using -laravel-eloquent) – Veerendra

+0

@Veerendra nope,請仔細閱讀標題。 – Jefsama

+0

第一件事你的第一和第二種方法使相同的意義只是寫的模式是不同的。其次,你甚至沒有嘗試過這兩種方法中的第二個where子句。請將代碼與您爲第二個where子句嘗試的內容一起發佈。請參閱示例$ users = User :: with(array( 'posts'=> function($ query,$ title){$ query-> where('title','=',$ title);}, 'posts.tags'=> 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

嘗試使用嵌套的熱切加載。有些是這樣的:

$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

事情是,你的orderBy是在「子查詢」。當laravel執行join(這是一種熱切的加載)時,order_by將與您無關。

我認爲一個有用的解決方案是使用查詢外部的orderby子句,使用laravel提供的別名。

$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_alias您可以使用debugbar來檢查此字符串的工作方式。

2

作爲您的描述,這兩種方法應該工作良好。

在您的User型號中是否有一些示波器使用->orderBy(),因此帶有閉合的orderBy()處於困惑狀態。

dd($query->toSql()) in with closure可能對您有幫助。