使用 Laravel 关系调用模型方法

Call a Model method using Laravel Relationship

我目前正在尝试使用 Laravel 关系来使用用户模型访问我的成就模型,我使用此关系代码:

public function achievements()
{
    return $this->hasMany('App\Models\User\Achievement');
}

我可以轻松地进行一些 eloquent 查询,但是我无法访问我在那里创建的任何方法,我无法访问此方法:

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;
}

但这会带来性能问题,因为每次我在用户模型中使用成就函数时都会创建一个新的 class 实例吗?

我正在尝试做的事情的正确方法是什么?

您可以使用 laravel scopes。与局部作用域一样,您可以定义通用约束集,您可以在整个应用程序中轻松 re-use。

在您的情况下,您可以这样使用,在模型中定义范围:

public function scopeAchievementsAvailableToClaim()
{
   return $query->where('achivement_avilable', true);
}

你可以这样使用:

Auth::user()->achievements()->achievementsAvailableToClaim();

它不起作用,因为您的 eloquent 关系是一个 hasMany,所以它 return 是一个集合。您不能从集合中调用相关模型函数。

你可以把它转储到 tinker 上以进一步理解我的意思。