在下面的代码中,$ request-> input(' id')返回一个整数。我可以回复,每次都能看到它。或者将其设置为变量并返回该变量以便每次都看到它。如果我用我的代码替换我的代码中的$ request->输入(' id')我得到了我正在寻找的东西,但是如果我留在变量中它总是返回一个空集。到底是怎么回事?我很困惑!
public function delete($id, Request $request)
{
$community = Community::find($id);
return $community->categories->where('id', $request->input('id'))->first();
}
答案 0 :(得分:1)
执行$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();