Laravel 5哪里方法不起作用

时间:2016-01-26 09:34:06

标签: php laravel parameters routing laravel-5

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

这是我的路线:

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);
}

我不知道我的代码有什么问题,请帮助。

1 个答案:

答案 0 :(得分:2)

您的问题是您在Laravel Collection上调用where(),而不是在Laravel查询生成器上调用。

Reports::all()将运行一个查询,该查询将从数据库中获取每个报告并将其放入Collection中。然后,您在该集合上运行where()方法。

不同之处在于Collection上的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子句匹配的记录,这可能会严重提升您的性能。如果您有一百万个报告,那么您不想构建一百万个对象的集合,然后遍历它们。