使用 Laravel 关系调用模型方法
Posted
技术标签:
【中文标题】使用 Laravel 关系调用模型方法【英文标题】:Call a Model method using Laravel Relationship 【发布时间】:2020-12-23 19:03:24 【问题描述】:我目前正在尝试使用 Laravel 关系来使用用户模型访问我的成就模型,我使用此关系代码:
public function achievements()
return $this->hasMany('App\Models\User\Achievement');
我可以轻松地进行一些雄辩的查询,但是我无法访问我在那里创建的任何方法,我无法访问此方法:
class Achievement extends Model
public function achievementsAvailableToClaim(): int
// Not an eloquent query
使用以下代码:
Auth::user()->achievements()->achievementsAvailableToClaim();
我相信我以错误的方式使用了这个 Laravel 函数,因为我在没有使用关系的情况下尝试了其他方法:
public function achievements()
return new \App\Models\User\Achievement;
但这会有性能问题,因为每次在用户模型中使用成就函数时,我都会创建一个新的类实例吗?
我正在尝试做的正确方法是什么?
【问题讨论】:
【参考方案1】:它不起作用,因为您的雄辩关系是 hasMany 所以它返回一个集合。您不能从集合中调用相关的模型函数。
您可以将其转储到 tinker 以了解更多我的意思。
【讨论】:
如果我从该方法返回一个手动创建的集合怎么办? 将您的功能实现更改为此,您应该很高兴。公共函数 scopeAchievementsAvailableToClaim() return $query->where('achievement_avilable', true);更多信息请查看laravel.com/docs/8.x/eloquent#local-scopes【参考方案2】:您可以使用 laravel scopes。像本地范围一样,您可以定义通用的约束集,您可以在整个应用程序中轻松地重复使用这些约束。
在您的情况下,您可以这样使用,在模型中定义范围:
public function scopeAchievementsAvailableToClaim()
return $query->where('achivement_avilable', true);
你可以像这样使用它:
Auth::user()->achievements()->achievementsAvailableToClaim();
【讨论】:
这行不通,因为resultsAvailableToClaim() 不是一个雄辩的查询。以上是关于使用 Laravel 关系调用模型方法的主要内容,如果未能解决你的问题,请参考以下文章
如何通过多对多关系获取与同一张表相关的行 - Laravel
Laravel Eager Loading 和动态绑定模型关系