为什么在 User::first() 上调用方法有效,但 User::where(...) 无效?

Why calling a method on User::first() works, but User::where(...) does not?

在 php artisan tinker 中 returns 有效:

>>> User::first()->is('admin');
=> true

Returns 错误:

>>> User::where('id', 1)->is('admin');
BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder\::is()'

为什么会这样?

因为在使用 ->where() 时,您正在构建一个集合,但是 ->first(),return 是模型。

对于eloquent到return的模型,你需要让它执行查询,通过添加一个->get()

然而,这也是 return 的一个集合。您可以使用 ->first()

解决此问题
User::where('id', 1)->first()->is('admin');

编辑评论:

尝试这样做,但上面的代码应该可以工作。

$user = User::where('id', 1)->first();
$isAdmin = $user->is('admin');

在你最上面的例子中,你定义了你想要的:

User;

然后你检索它:

first();

在您的底部示例中,您还定义了您想要的内容:

 User::where('id', 1);

但是你没有在任何地方找回它。所以还不能做 ->is('admin'),因为你没有要检查的结果。

您可以检索第一个匹配的或包含所有匹配的集合:

User::where('id', 1)->first(); // One result
User::where('id', 1)->get(); // Collection of results

this User::first() returns User class object.

and User::where('id', 1) returns eloquent 查询对象.

这就是它不起作用的原因。

然而 User::where('id', 1)->get(); 将给出结果行数组。但这也无法调用 is() on.

如其他答案所述,where() return 是一个查询生成器,而 where()->get() return 是一个集合。然后,您可以 return 从集合中调用 rirst()。

$user = User::where('id', 1)->get()->first();
$isAdmin = $user->is('admin');