簡體   English   中英

在Laravel 5.4中使用聯接添加過濾器或其他查詢的Where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM