将模型方法称为属性而不是函数[重复]
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();
【讨论】:
以上是关于将模型方法称为属性而不是函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章