Laravel动态查询

时间:2019-08-13 07:22:01

标签: laravel laravel-5.8

我有一个带有三个过滤器的GET表单。

  1. 制作
  2. 年份
  3. 国家

我需要从数据库获取所有帖子。但是基于这三个过滤器过滤结果。

  1. 如果选择了一个国家,则仅获取该国家或所有国家的信息。
  2. 如果选择了某个品牌,则仅获取该品牌或所有品牌的帖子
  3. 如果选择了一年,则仅获取该年或所有年份的信息

如何编写一个查询来过滤所有这三个选项。我所做的工作用于if和else语句,并为每种情况编写了不同的查询。这是9条查询,以获得一个信息。我们可以使其动态化,只进行一个查询吗?

我的示例查询:

    public function search(Request $request)
    {

        $search=$request->input('search');

        if($request->input('country') == "all")
        {
           $posts = Post::where('status','Published')->orderBy('status_change','DESC')
           ->where('status','Published')
           ->where(function($query) use ($search){
               $query->where('title','LIKE','%'.$search.'%');
               $query->orWhere('model','LIKE','%'.$search.'%');
               $query->orWhere('notes','LIKE','%'.$search.'%');
               $query->orWhere('description','LIKE','%'.$search.'%');
           })
           ->paginate(25);            
        }
        else
        {
           $posts = Country::where('country_name', $request->input('country'))->first()->posts()->orderBy('status_change','DESC')
           ->where('status','Published')
           ->where(function($query) use ($search){
               $query->where('title','LIKE','%'.$search.'%');
               $query->orWhere('model','LIKE','%'.$search.'%');
               $query->orWhere('notes','LIKE','%'.$search.'%');
               $query->orWhere('description','LIKE','%'.$search.'%');
           })
           ->paginate(25);
        }
        return view('welcome')
        ->with('published_posts',$posts)
        ;
    }

2 个答案:

答案 0 :(得分:0)

我认为类似的方法会起作用:

/**
 * @param Request $request
 */
function search(Request $request)
{

    $postsQuery = Post::where('status', 'Published');

    if ($request->has('country')) {
        $country = $request->country;
        // assuming relationships are setup correclty
        $postsQuery->whereHas('country', function ($query) use ($country) {
            $query->where('country_name', 'LIKE', $country);
        });

    }
    if ($request->has('search')) {
        $postsQuery->where(function ($query) use ($search) {
            $query->where('title', 'LIKE', '%' . $request->search . '%');
            $query->orWhere('model', 'LIKE', '%' . $request->search . '%');
            $query->orWhere('notes', 'LIKE', '%' . $request->search . '%');
            $query->orWhere('description', 'LIKE', '%' . $request->search . '%');
        });
    }

    $postsQuery->orderBy('status_change', 'DESC')->paginate(25);

    return view('welcome')->with('published_posts', $result);
}

答案 1 :(得分:0)

我使用了“何时”方法。

$make = null;
$year = null;
$country = null;

if($request->filled('make')){
    $make = $request->query('make');
}
if($request->filled('year')){
    $year = $request->query('year');
}
if($request->filled('country')){
    $country = $request->query('country');
}

$posts = DB::table('posts')
    ->when($make, function($query, $make){
        return $query->where("make", "=", $make);
    })
    ->when($year, function($query, $year){
        return $query->whereYear("year", "=", $year);
    })
    ->when($country, function($query, $country){
        return $query->where('country', "like", $country);
    })
    ->get();

查看Laravel Docs:
查看文章here