忽略"其中"如果没有提供过滤器,则Laravel数据库查询中的子句

时间:2016-03-04 17:15:29

标签: php database laravel eloquent

我目前正试图在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();

出于性能目的,我还想避免必须加载所有结果,然后再应用过滤器。 Laravel有没有为此而建造的东西?

1 个答案:

答案 0 :(得分:3)

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

$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();