我正在尝试使用路由中的参数查询记录,但它无法正常工作。
这是我的路线:
Route::get('reports/{id}', 'ReportsController@show');
这是我的控制器方法:
public function show($id) {
return Reports::all()->where('user_id', $id);
}
当访问路由'reports/1'
时,它不返回任何内容。但是,如果我在 id 中硬编码以在方法中使用,它确实有效:
public function show($id) {
return Reports::all()->where('user_id', 1);
}
我不知道我的代码出了什么问题,请帮忙。
您的问题是您在 Laravel 集合上调用 where()
,而不是在 Laravel 查询生成器上。
Reports::all()
将运行一个查询,该查询将从数据库中获取每个报表并将其放入集合中。然后,在该集合上运行 where()
方法。
不同之处在于,集合上的 where()
方法循环遍历集合中的项,并进行严格的比较 (===),而查询生成器将参数化的 where 子句添加到 SQL,该子句不关心变量类型。
遇到的是,当使用变量时,您正在运行where('user_id', '1')
,这是将user_id
字段与字符串"1"进行严格的比较(===)。由于所有用户 ID 都是整数,因此不会得到任何结果。
您真正想做的是将 where 条件添加到 SQL 语句中。而不是您当前的逻辑,您需要:
public function show($id) {
return Reports::where('user_id', $id)->get();
}
这将解决您的问题,并仅返回与您的 where 子句匹配的记录,这可能会严重提高您的性能。如果您有一百万个报表,则不希望生成包含一百万个对象的集合,然后循环访问它们。