为什么在 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');
在 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');