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


Laravel Eloquent model returning empty sets with a variable in where clause

在下面的代码中,$request->input('id')返回一个整数。我每次都可以看到它。或者将其设置为一个变量,并返回该变量,以便每次也能看到它。如果我用整数值替换代码中的$request->input('id'),我就会得到我想要的值,但是如果我保留一个变量,它总是返回一个空集。发生了什么事?我太困惑了!

public function delete($id, Request $request)
{
    $community = Community::find($id);
    return $community->categories->where('id', $request->input('id'))->first();
}

执行$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();