将模型方法调用为 属性 而不是函数

Calling a model method as property and not a function

最近开始学习 Laravel,遇到了一些代码,这让我有些头疼,需要解释为什么会这样。

也就是说,我设置了一个基本的 laravel 应用程序,在我的 User 模型(标准模型 class)中我创建了一个方法:

 public function projects() {
    return $this->hasMany(Project::class, 'project_owner_id');
}

很简单,我有一个 Project 模型,它有自己的 table,它有 project_owner_id 的列和外键,我只是引用两个模型。

现在在我的控制器中,当我尝试访问该方法并获取属于已登录用户的所有项目时,如下所示,我收到错误消息:

$projects = auth()->user()->projects();

我花了一些时间才意识到错误是我在调用 projects 作为函数而不是 属性 时引起的,一旦我重构了代码:

$projects = auth()->user()->projects;

一切都很好并且工作正常,我正在获取属于登录用户的项目。

我的问题是:有人可以解释为什么会这样,为什么当我尝试将 projects 方法作为函数调用时它不起作用?

Eloquent 关系在您的 Eloquent 模型 类.

上定义为方法
public function projects() {
    return $this->hasMany(Project::class, 'project_owner_id');
}

定义关系后,我们可以使用 Eloquent 的动态属性检索相关记录。动态属性允许您访问关系方法,就像它们是在模型上定义的属性一样:

auth()->user()->projects;

将关系定义为方法提供了强大的方法链接和查询 capabilities.For 例如,我们可以在这个 projects 关系上链接额外的约束:

auth()->user()->projects()->where("status", 1)->get();