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