3

上下文

我使用 Laravel 的 Eloquent作为我的 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();
}

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

我是在错误地接近这个吗?我缺少一些基本的东西吗?

请注意,如果我写的是:

$results = Cars::where('status', 0);
return $results->get();

正确生成汽车列表

4

2 回答 2

7

你应该像这样改变你的功能:

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();
}
于 2015-12-06T23:20:26.077 回答
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 的功能。

于 2015-12-06T23:20:25.320 回答