拉拉维尔 5 方法不起作用


Laravel 5 where method not working

我正在尝试使用路由中的参数查询记录,但它无法正常工作。

这是我的路线:

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 子句匹配的记录,这可能会严重提高您的性能。如果您有一百万个报表,则不希望生成包含一百万个对象的集合,然后循环访问它们。