为啥在 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 方法?