在Laravel Eloquent中扩展模型

3
在我的应用程序中,我有一个用户(显然)。
class User {

    public function teams()
    {
        return $this->belongsToMany(Team::class, 'team_user', 'user_id')->wherePivot('confirmed', '!=', null);
    }
}

我正在尝试创建一个扩展User的模型,如下所示

class Teamleader extends User
{
    protected $table = 'users';

    public static function boot()
    {
        parent::boot();

        static::addGlobalScope(new TeamleaderScope);
    }
}

这个想法是团队领导是在team_user关系表中,具有isLeader布尔值为真的用户。在我的TeamleaderScope中,我尝试了类似以下的内容:

class TeamleaderScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $model->teams()->wherePivot('isLeader', true);
    }
}

但是这似乎是错误的,因为Teamleader::all()只返回所有用户。我从未尝试过像这样扩展模型,但应该是可能的,对吧?有人能指导一下我吗?


Ramin在下面提供了符合OOP原则的组合优于继承的指导,这是一个好主意。我曾经尝试过使用继承和特征来实现,但是我想表达的观点是,这通常会带来更多的麻烦而不值得。我发现模型继承有用的情况是连接到遗留数据库的情况,其中同一张表中存在多个非常不同的实体,但这似乎不是这种情况。 - Josh Rumbut
也许你可以在作用域的 apply() 方法中尝试这个:$builder->whereHas('team_user', function ($query) { $query->wherePivot('isLeader', true); }); - i--
1个回答

2
为了在PHP中重用两个类中的公共方法等,您可以使用trait。 在您的情况下,在其余模型旁边创建一个名为CommonTrait.php的PHP文件,并且其中必须像下面这样:
<?php

namespace App;


trait CommonTrait
{
    public function commonMethodOne()
    {
        // anything
    }

    public function commonMethodTwo()
    {
        // anything
    }

    // for get leaders.
    public function scopeLeaders()
    {
        return $this->teams()->wherePivot('isLeader', true);
    }

    public function scopeSearchLeaders($query, $keyword)
    {
         return $query->where('name', $keyword)->wherePivot('isLeader', true);
    }


}

现在你可以在任何需要的地方使用 trait

比如,在 User.php 中使用:

<?php

namespace App;

class User
{
    use CommonTrait;
}

所以,现在CommonTrait.php中的所有方法或变量都可以在User.php中访问,您可以在User.php中使用这些内容,并且您可以在Teamleader.php中使用所有方法。例如,如果您想获取作为团队领导的用户,您可以尝试以下代码:

$leaders = User::Leaders();
$resultSearch = User::SearchLeaders("Gard Mikael");

I hope be useful


谢谢您的回复。我想我可以使用Traits。但是,应该有某种限制吧。如果Teamleader只是一个模型,它引用相同的用户表,那么即使具有id为1的用户不一定是Teamleader,我仍然可以说Teameleader :: find(1)。我不确定在哪种情况下这会成为问题,但如果逻辑正确,Teamleaders只是Users的子集,对吗?无论如何,谢谢。 - Gard
@GardMikaelFjeldavli,没错,我编辑了我的答案。你可以定义与团队领导相关的作用域,并使用User::中的这些方法。 - Ramin eghbalian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接