【问题标题】:Laravel 5 where method not workingLaravel 5 方法不起作用的地方
【发布时间】:2016-05-02 19:55:42
【问题描述】:

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

这是我的路线:

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

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

【问题讨论】:

  • 您没有创建或返回视图。换句话说,您不是在尝试使用return 的上下文中创建输出。
  • @Repox 这是一个 api 模型后端,我使用 angular 来获取数据
  • 你仍然没有返回任何东西。看看documentation on responses
  • @LokiSinclair 和 @Repox 我是 laravel 的新手,我不明白,当我返回 return Reports::all()->where('user_id', 1 ); 它返回一个 json 但当我返回 return Reports::all()->where('user_id', $id ); 它只返回 []。
  • return Reports::where('user_id', $id)->first();

标签: php laravel parameters routing laravel-5


【解决方案1】:

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

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

不同之处在于 Collection 上的 where() 方法循环遍历集合中的项目,并进行严格比较 (===),而查询构建器向 SQL 添加了参数化的 where 子句,这不会不关心变量类型。

您遇到的是,在使用变量时,您正在运行 where('user_id', '1'),它正在对 user_id 字段与字符串“1”进行严格比较 (===)。由于所有用户 id 都是整数,因此您不会得到任何结果。

您真正想要做的是将您的 where 条件添加到 SQL 语句中。而不是你当前的逻辑,你想要:

public function show($id) {
    return Reports::where('user_id', $id)->get();
}

这将解决您的问题,并且仅返回与您的 where 子句匹配的那些记录,这可能会大大提高您的性能。如果您有一百万个报告,您不希望构建一个包含一百万个对象的集合,然后遍历它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2018-04-21
    • 1970-01-01
    • 2016-09-04
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多