有条件地建立一个Eloquent查询

时间:2015-12-06 23:06:13

标签: php laravel laravel-5 eloquent laravel-query-builder

上下文

我正在使用Laravel的Eloquent作为我的ORM。我正在创建一个API端点,该端点提供对具有多个属性(Carscolormake)的status的访问权限。

我的端点允许客户端按这些属性的任何子集过滤返回值,如果它们没有提供属性,那么我将返回所有属性。

问题

我想构建一个条件查询,它从“all”开始,并根据指定的参数缩小。这就是我写的:

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

正确生成汽车列表

2 个答案:

答案 0 :(得分:6)

你应该改变你的功能:

public function getCars(Request $request)
{
    $results = Cars::query();

    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->get()->toJson();
}

答案 1 :(得分:3)

为简单起见,你可以试试这个。

$query = Cars::query(); // no query executed, just give us a builder

$query->where(array_only($request->all(), ['color', 'make', 'status'])); // where can take a key value array to use
// update: only taking the vars you need, never trust incoming data

return $query->get(); // will be converted to Json for you

这只会向数据库查询您的需求。你们将返回所有结果,然后在集合中过滤它们。

更新: 正如Joseph所说,$ request-> only()和array_only之间有不同的功能。这里需要array_only的功能。