【问题标题】:Laravel different use of where clauseLaravel 对 where 子句的不同使用
【发布时间】:2020-04-07 07:35:37
【问题描述】:

我想问一下 Laravel 中的一些功能,我正在使用其他人编写的一些旧代码,我想了解它为什么会这样写:

$users = Users::all();
$results = $users->where('age', '>','30')->get();

我的问题是如何将 'where' 子句与 '$users' 变量一起使用?这工作正常,没有给出错误,它返回所需的结果。但据我所知,'where' 子句可以像这样使用:

Classname::where()->get()

User 模型是否实现了某些功能或使用某些东西能够以这种方式调用“where”子句?当我尝试做同样的事情但使用我正在创建的新模型时,我得到了

"Type error: Too few arguments to function Illuminate\\Support\\Collection::get()

【问题讨论】:

  • $users = User::all(); $results = $users->where('age', '>', 30)->get(); 从数据库的角度来看是昂贵的。使用$results = User::where('age', '>', 30)->get(); 考虑当您在表中有 500.000 个用户并且其中只有少数超过 30 岁的情况。首先调用所有结果不是数据库引擎应该如何工作的方式。
  • 在不工作之前,您可以随心所欲地使用它。但是,从数据库中获取您需要的内容,而不是所有内容。我告诉你你应该如何使用。

标签: laravel model where-clause


【解决方案1】:

'where' 子句如何与 '$users' 变量一起使用?

可以使用 where 子句,因为 all() method 返回一个 Collection,where()get() 方法可用于 Collection 类。

User 模型是否实现了某些功能或使用某些东西能够以这种方式调用 'where' 子句?

每个 Eloquent 模型都用作 query builder,这将使您能够添加约束并在之后使用 get() 方法接收结果。

【讨论】:

  • 您是否将get() 方法与all() 方法结合使用?这可能会触发错误。如果这不是解决方案,请分享导致异常的代码。
  • 不,不是。我像上面的例子一样使用它,还有 $roles = $users->roles;然后 $roles->where('slug', 'admin')->get();
  • 我仍然缺少一些上下文,但是如果用户有许多角色,这将不起作用,因为 $users 是用户的集合,而您需要一个可以为其加载的用户关系。您可能还需要将$users->roles->where() 更改为$users->roles()->where()
  • 用户有很多角色。但在这种情况下,我们不是在变量“$roles”中获取角色,然后在其上应用“where”子句吗?
【解决方案2】:
// Collection::get() is diferent with QueryBuilder::get()

$builder = Users::query(); // you got QueryBuilder object
$builder->where('age', '>','30'); // you got QueryBuilder object
$list = $builder->get(); // you got Collection object
$list->where('age', '>','30'); // you got Collection object

// Collection object has 'get', but it require argument.
// QueryBuilder object has 'get' too, but do not require argument.

【讨论】:

  • 我在执行 $roles = $users->roles; 时也遇到了错误。然后 $roles->where('slug', 'admin')->get();其中角色与用户有关系。我得到了同样的错误“类型错误:函数 Illuminate\\Support\\Collection::get() 的参数太少
  • 哇……你想得到结果吗?尝试: $rolesQB = $user->roles(); $rolesQB->where('slug', 'admin'); $rolesCo = $rolesQB->get(); $roles = $rolesCo->toArray();
  • 顺便说一句,数据库中的“slug”字段在哪里?在用户表中?还是在角色表中?
猜你喜欢
  • 2020-08-18
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2019-09-08
相关资源
最近更新 更多