将模型方法称为属性而不是函数[重复]

Posted

技术标签:

【中文标题】将模型方法称为属性而不是函数[重复]【英文标题】:Calling a model method as property and not a function [duplicate] 【发布时间】:2020-04-25 21:30:31 【问题描述】:

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

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

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

很简单,我有一个Project 模型,它有自己的表,它有一个列和project_owner_id 的外键,我只是在引用两个模型之间的关系。

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

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

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

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

一切正常,我正在获取属于登录用户的项目。

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

【问题讨论】:

$projects = auth()->user()->projects()->get(); auth()->user()->projects() 返回关系对象,但 auth()->user()->projects 返回关系结果 您可以从上面的链接中找到完整的答案。 【参考方案1】:

Eloquent 关系被定义为 Eloquent 模型类的方法。

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

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

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

将关系定义为方法提供了强大的方法链接和查询功能。例如,我们可以在此项目关系上链接附加约束:

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

【讨论】:

以上是关于将模型方法称为属性而不是函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用一个属性而不是整个对象来区分[重复]

为什么Spring称为框架而不是库? [重复]

检查模型是不是在laravel中返回结果的最佳方法[重复]

函数返回空列表而不是 List<String> [重复]

在编程术语中,您将这些指令之间的区别称为:[重复]

等待2个方法而不是1个[重复]