为啥在 User::first() 上调用方法有效,但 User::where(...) 无效?
Posted
技术标签:
【中文标题】为啥在 User::first() 上调用方法有效,但 User::where(...) 无效?【英文标题】:Why calling a method on User::first() works, but User::where(...) does not?为什么在 User::first() 上调用方法有效,但 User::where(...) 无效? 【发布时间】:2016-10-21 19:33:09 【问题描述】:在 php artisan tinker 中工作并返回 true:
>>> User::first()->is('admin');
=> true
返回错误:
>>> User::where('id', 1)->is('admin');
BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder\::is()'
为什么会这样?
【问题讨论】:
【参考方案1】:因为在使用->where()
时,您正在构建一个集合,但->first()
会返回模型。
要让 eloquent 返回模型,您需要通过添加 ->get()
要求它执行查询
然而,这也返回一个集合。你可以使用->first()
解决这个问题
User::where('id', 1)->first()->is('admin');
为 cmets 编辑:
尝试这样做,但上面的代码应该可以工作。
$user = User::where('id', 1)->first();
$isAdmin = $user->is('admin');
【讨论】:
现在我得到错误:BadMethodCallException with message 'Method is does not exist.'
用户模型上有is
函数吗?确保您准确复制了代码。
这是我的用户模型的样子 - github.com/caffeinated/shinobi/wiki/Usage
仔细检查您是否复制了我示例中的代码,如果这不起作用,请尝试使用编辑中的代码。
如果你想通过 id 获取用户,你也可以使用User::find($id)
。或者,如果您希望在未找到 User::findOrFail($id)
的情况下获得 404。【参考方案2】:
在您的***示例中,您定义了您想要的内容:
User;
然后你检索它:
first();
在您的底部示例中,您还定义了您想要的内容:
User::where('id', 1);
但是,您无法在任何地方检索它。所以还不能做->is('admin')
,因为你没有结果可以做检查。
您可以检索第一个匹配的或所有匹配的集合:
User::where('id', 1)->first(); // One result
User::where('id', 1)->get(); // Collection of results
【讨论】:
【参考方案3】:这个 User::first() 返回 User 类对象。
和 User::where('id', 1) 返回 雄辩的查询对象。
这就是它不起作用的原因。
然而 User::where('id', 1)->get(); 将给出结果行数组。但这也无法调用 is() 。
【讨论】:
【参考方案4】:如其他答案所述,where() 返回一个查询构建器,而 where()->get() 返回一个 Collection。然后,您可以返回从 Collection 调用的 rirst()。
$user = User::where('id', 1)->get()->first();
$isAdmin = $user->is('admin');
【讨论】:
以上是关于为啥在 User::first() 上调用方法有效,但 User::where(...) 无效?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 JDBC 驱动程序调用在 Tomcat 中有效,但在 JBOSS 中无效
为啥我在模式静态方法上定义的错误消息没有显示,即使错误处理显然有效?
Django request.user.first_name 在 Safari 中不起作用
Java:为啥我不能在 main 之外调用这个方法? [关闭]
为啥 Android 中 Toolbar.setTitle 没有效果
为啥在我的 UIPanGestureRecognizer 上调用 UILongPressGestureRecognizer 方法?