如果未提供过滤器,则忽略Laravel数据库查询中的“where”子句


Ignore "where" clause in Laravel database query if no filter is provided

我目前正在尝试在 Laravel 5.1 中找到最干净的查询方法。我正在创建一个 API,它将从 MySQL 数据库返回一个 JSON 字符串。

我希望能够有一个类似的网址

mydomain.com/api/courses

这将返回我们所有课程的 JSON 列表。我还希望能够传入一个 GET 查询参数,例如

mydomain.com/api/courses?subject=BUS

这将只返回商业课程。到目前为止非常基本。在我的控制器中,我有

$subject = 'Request::input('subject');
if ($subject) {                                     //filter to only query parameters
    $results    = 'DB::table('course_listings')
                    ->where('subject', $subject)
                    ->get();
} else {                                            //return all results
    $results = 'DB::table('course_listings')->get();
}

但是,这似乎有点不必要的混乱,特别是如果我想开始添加其他查询参数。我想做的是,如果查询参数为空,则能够忽略where()

$results = 'DB::table('course_listings')
    ->where('subject', $subject) //ignore this line if no $subject
    ->get();

出于性能目的,我还希望避免加载所有结果,然后应用过滤器。拉拉维尔有什么为此建造的吗?

可以将

查询保存到变量,然后仅在if块中应用where

$subject = Request::input('subject');
$query = DB::table('course_listings');
if ($subject) {
    $query->where('subject', $subject);
}
$results = $query->get();

如果你想完全放弃if语句,你可以这样做:

$constraints = array_only(Request::input(), 'subject');
$results = DB::table('course_listings')->where($constraints)->get();