设置关系,以便用户可以通过同一个表遵循多个模型类型

时间:2018-02-14 01:23:33

标签: laravel laravel-5 polymorphism laravel-5.5 polymorphic-associations

我一直在敲我的键盘大约2个小时,现在试图解决这个问题,我终于到了需要帮助的地方。

enter image description here

我希望Users能够通过Alpha表跟踪BetaFollows模型。

理想情况下,代码可能如下所示:

$user = User::find(1);
$alpha = Alpha::find(1);
$beta = Beta::find(1);
$user->following()->save($alpha);
$user->following()->save($beta);

我已经尝试了这种方法,它具有规则的多态关系和多对多的多态关系,并且取得了不同程度的成功。无论我尝试过什么,我都无法完全意识到这一点,我认为只是精神疲惫阻碍了我。

1 个答案:

答案 0 :(得分:1)

这在我看来就像UsersFollows之间的一对多关系,然后是FollowsAlphas / Betas之间的传统多态关系

表格结构

alphas
    id - integer
    name - string

betas
    id - integer
    name - string

follows
    id - integer
    user_id - integer
    followable_id - integer
    followable_type - string

users
    id - integer

<强>模型

class Follow extends Model
{
    public function followable()
    {
        return $this->morphTo();
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

class Alpha extends Model
{
    public function follows()
    {
        return $this->morphMany(Follow::class, 'followable');
    }
}

class Beta extends Model
{
    public function follows()
    {
        return $this->morphMany(Follow::class, 'followable');
    }
}

class User extends Model
{
    public function follows()
    {
        return $this->hasMany(Follow::class);
    }

    public function alphas()
    {
        return $this->follows()->where('followable_type', Alpha::class);
    }

    public function betas()
    {
        return $this->follows()->where('followable_type', Beta::class);
    }
}

保存关系

$user = User::find($uid);

$follow = new Follow([
    'user_id' => $user->id
]);

$alpha = Alpha::find($aid);

$alpha->follows()->save($follow);