【问题标题】:Call a Model method using Laravel Relationship使用 Laravel 关系调用模型方法
【发布时间】: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;
}

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

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

【问题讨论】:

    标签: php laravel eloquent model relationship


    【解决方案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() 不是一个雄辩的查询。
    猜你喜欢
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2018-09-13
    相关资源
    最近更新 更多