使用 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

larave学习笔记1-安装配置

Laravel Eager Loading 和动态绑定模型关系

Laravel 4:PHP 致命错误:调用未定义的方法 Blueprint::int()

具有预加载关系的 Laravel 模型

Laravel 模型关联建立与查询