在下面的代码中,$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
方法,该方法是关系查询的结果。因此,在从数据库中获取where
和first
之后,将它们与内存中的所有相关类别一起运行。
如果执行了$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();