【发布时间】:2016-03-11 11:45:11
【问题描述】:
背景
我使用 Laravel 的 Eloquent 作为我的 ORM。我正在创建一个 API 端点,它提供对具有多个属性(color、make、status)的Cars 的访问。
我的端点允许客户端通过这些属性的任何子集过滤返回值,如果它们不提供任何属性,那么我将返回所有内容。
问题
我想构建一个条件查询,它从“全部”开始,并根据指定的参数缩小范围。这是我写的:
public function getCars(Request $request)
{
$results = Cars::all();
if($request->has('color'))
$results = $results->where('color', $request->input('color'));
if($request->has('make'))
$results = $results->where('make', $request->input('make'));
if($request->has('status'))
$results = $results->where('status', $request->input('status'));
return $results->toJson();
}
如果我在没有参数的情况下调用它,API 会返回数据库中所有汽车的列表。
但是,如果我指定(例如)0 的状态,API 会返回一个空集,尽管事实上有些汽车的状态是0。
我是不是在错误地处理这个问题?我是否缺少一些基本的东西?
请注意,如果我写的是:
$results = Cars::where('status', 0);
return $results->get();
正确生成汽车列表
【问题讨论】:
-
你确定
$request->input('status')等于 0 并且是从前端接收的,而不是像字符串这样的不同格式吗? -
好问题——是的,为了这个问题,我编辑了输入验证。
-
您会得到
$results->get()的结果,因为它实际上返回了一个集合,而您的$results->toJson()实际上是一个eloquent builder instance。在责备客户之前,请先尝试dd($results)确定。
标签: php laravel laravel-5 eloquent laravel-query-builder