添加过滤器或其他 Where 子句以在 Laravel 5.4 中使用联接查询

Adding filters or additional Where Clauses to Query with joins in Laravel 5.4

Hello Stack 溢出社区

我目前有以下代码(示例 1),它将 return 餐厅列表及其食物类型和区域,使用额外的连接。

我需要添加更多 WHERE 子句,但前提是要传递任何子句,例如 (example 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()(如另一个 post 中所述),但我收到相同的错误

示例 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() 结果调用 appends() 方法。目前,您将继续在查询生成器上调用它。

->paginate()、returns 分页功能来自 $restaurants 查询构建器

// ...
$pagination = $restaurants->paginate();
$pagination->appends(array (
    'q' => Input::get ( 'q' ) 
) )->links();

https://laravel.com/docs/5.5/pagination#displaying-pagination-results