有条件地建立一个Eloquent查询

sli*_*fty 3 php laravel eloquent laravel-5 laravel-query-builder

上下文

我使用Laravel的雄辩如我的ORM.我创建了一个API端点提供访问Cars其有几个属性(color,make,status).

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

问题

我想构建一个条件查询,它从"全部"开始,并根据指定的参数缩小.这是我写的:

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();
}
Run Code Online (Sandbox Code Playgroud)

如果我在没有参数的情况下调用它,API将返回数据库中所有汽车的列表.但是,如果我指定(例如)0API的状态返回一个空集,尽管有些汽车的状态为0.

我接近这个错误吗?有什么根本我缺席的吗?

请注意,如果我改为:

$results = Cars::where('status', 0);
return $results->get();
Run Code Online (Sandbox Code Playgroud)

正确生成汽车列表

Mar*_*łek 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();
}
Run Code Online (Sandbox Code Playgroud)

  • `query()`来自[model instance](http://laravel.com/api/5.1/Illuminate/Database/Eloquent/Model.html).更好地阅读api和源代码以了解更多:) (2认同)