[英]Adding filters or additional Where Clauses to Query with joins in Laravel 5.4
你好堆棧溢出社區
我目前有以下代碼( 示例1 ),它將使用其他聯接返回餐廳列表及其食物類型和區域。
我需要添加更多的WHERE子句,但前提是有任何要傳遞的子句( 如示例2 )
搜索可能僅具有名稱或名稱的一部分,也許他們只是想按區域或食物類型進行搜索。
例子1
$q = Input::get ( 'q' );
if($q != ""){
$restaurants = DB::table('restaurant')
->where ( 'restaurant.name', 'LIKE', '%' . $q . '%' )
->join ( 'area', 'restaurant.area_id', '=', 'area.id' )
->join ( 'food_type', 'restaurant.food_type_id', '=', 'food_type.id' )
->select( 'restaurant.*', 'food_type.name as food_type_name', 'area.slug as area_slug', 'area.name as area_name')
->paginate(2);
$pagination = $restaurants->appends ( array (
'q' => Input::get ( 'q' )
) );
} else {
$restaurants = DB::table('restaurant')
->join ( 'area', 'restaurant.area_id', '=', 'area.id' )
->join ( 'food_type', 'restaurant.food_type_id', '=', 'food_type.id' )
->select( 'restaurant.*', 'food_type.name as food_type_name', 'area.slug as area_slug', 'area.name as area_name')
->paginate(15);
}
例子2
if ($q){
->where ( 'restaurant.name', 'LIKE', '%' . $q . '%' )
}
if ($request->has('area')){
->where('area', $request->input('area'));
}
if ($request->has('foodtype')){
foreach(foodtype as name => value)
->where('foodtype', $value);
}
我覺得應該有辦法做到這一點,而不是為每種可能的結果寫出不同的查詢
我已經測試了Unamata Sanatarai的響應( 示例3,但這帶有一個錯誤:
調用未定義的方法Illuminate \\ Database \\ Query \\ Builder :: appends()
我嘗試用-> get()替換-> paginate()(如另一篇文章所述),但是我收到相同的錯誤
例子3
$q = Input::get ( 'q' );
if($q != ""){
$restaurants = DB::table('restaurant');
$restaurants->where ( 'restaurant.name', 'LIKE', '%' . $q . '%' );
$restaurants->join ( 'area', 'restaurant.area_id', '=', 'area.id' );
$restaurants->join ( 'food_type', 'restaurant.food_type_id', '=', 'food_type.id' );
$restaurants->select( 'restaurant.*', 'food_type.name as food_type_name', 'area.slug as area_slug', 'area.name as area_name');
$restaurants->paginate(15);
$pagination = $restaurants->appends ( array (
'q' => Input::get ( 'q' )
) );
} else {
$restaurants = DB::table('restaurant')
->join ( 'area', 'restaurant.area_id', '=', 'area.id' )
->join ( 'food_type', 'restaurant.food_type_id', '=', 'food_type.id' )
->select( 'restaurant.*', 'food_type.name as food_type_name', 'area.slug as area_slug', 'area.name as area_name')
->paginate(15);
}
示例4將解釋我的最新錯誤
未定義的屬性:Illuminate \\ Database \\ MySqlConnection :: $ main_image
$ main_image是數據庫中的字段之一-在我將查詢更改為示例3之前,此方法工作正常
示例4顯示了帶有鏈接的新代碼,這會產生錯誤
例子4
$restaurants = DB::table('restaurant');
$restaurants->join ( 'area', 'restaurant.area_id', '=', 'area.id' );
$restaurants->join ( 'food_type', 'restaurant.food_type_id', '=', 'food_type.id' );
$restaurants->select( 'restaurant.*', 'food_type.name as food_type_name', 'area.slug as area_slug', 'area.name as area_name');
$restaurants->paginate(15)->links();
您可以按照示例2中所述進行操作。
在調用最后一個方法之前,您可以繼續操作Builder。
您可以修改查詢生成器,直到調用->paginate()
或->get()
或->first()
...
$restaurants = DB::table('restaurant');
if ($q){
$restaurants->where ( 'restaurant.name', 'LIKE', '%' . $q . '%' )
}
if ($request->has('area')){
$restaurants->where('area', $request->input('area'));
}
if ($request->has('foodtype')){
foreach(foodtype as name => value)
$restaurants->where('foodtype', $value);
}
return $restaurants->paginate();
為了回答您的第二個問題,一個關於appends()錯誤的問題。
可以在paginate()
結果上調用paginate()
。 目前,您正在繼續在查詢生成器上調用它。
函數->paginate()
從$ restaurants查詢構建器返回分頁。
// ...
$pagination = $restaurants->paginate();
$pagination->appends(array (
'q' => Input::get ( 'q' )
) )->links();
https://laravel.com/docs/5.5/pagination#displaying-pagination-results
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.