我目前正试图在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有没有为此而建造的东西?
答案 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();