Laravel Eloquent模型在where子句中返回带有变量的空集

时间:2016-07-22 19:20:29

标签: php laravel eloquent

在下面的代码中,$ request-> input(' id')返回一个整数。我可以回复,每次都能看到它。或者将其设置为变量并返回该变量以便每次都看到它。如果我用我的代码替换我的代码中的$ request->输入(' id')我得到了我正在寻找的东西,但是如果我留在变量中它总是返回一个空集。到底是怎么回事?我很困惑!

public function delete($id, Request $request)
{
    $community = Community::find($id);

    return $community->categories->where('id', $request->input('id'))->first();
}

1 个答案:

答案 0 :(得分:1)

执行$community->categories->where(...时,您在Collection对象上调用where方法,这是关系查询的结果。因此,在从数据库中获取所有相关类别后,您正在运行wherefirst所有相关类别。

如果您执行$community->categories()->where(...,则在Relation对象(其本身包含Builder)上调用where方法。在这种情况下,在运行最后一个方法first(最常见的是get)之前不会触发查询,并且where过滤由DBMS完成,仅限您的应用程序收到匹配的类别。这可能更有效。

所以,至于你的问题:

您可能会注意到Collection::where方法的签名有第三个参数,即比较是否严格,默认为true。我的猜测是请求输入是一个字符串,并不严格匹配转换为int的id。

同时,Builder::where方法没有严格的比较(再次,它不是执行它的PHP)。所以你不必担心。

选项1:

return $community->categories->whereLoose('id', $request->input('id'))->first();

选项2(在我看来更好):

return $community->categories()->where('id', $request->input('id'))->first();