拉拉维尔多态关系有许多通过

我有一个模型Subscriber

// Subscriber Model

id
user_id
subscribable_id
subscribable_type

public function user()
{
    return $this->belongsTo('App\User');
}

public function subscribable()
{
    return $this->morphTo();
}

和模型Topic

// Topic Model

public function subscribers()
{
    return $this->morphMany('App\Subscriber', 'subscribable');
}

我想让所有用户通过模型,通知他们Subscriber

Notification::send($topic->users, new Notification($topic));

// Topic Model


public function users()
{
    return $this->hasManyThrough('App\User', 'App\Subscriber');
}

有什么想法吗?


答案 1
// Topic Model

public function users()
{
    return $this->hasManyThrough('App\User', 'App\Subscriber', 'subscribable_id')
        ->where(
            'subscribable_type', 
            array_search(static::class, Relation::morphMap()) ?: static::class
        );
}

多态关系与任何其他关系相同,但在 上添加了一个约束,可以从数组中检索,也可以直接使用类名。hasManyThroughsubscribable_typeRelation::morphMap()


答案 2

除了 Matt 的方法之外,以下代码也可能是另一种解决方案:

//Topic Model
public function users()
{
    return $this->belongsToMany(User::class, 'subscribers', 'subscribale_id', 'user_id')
        ->where('subscribale_type', static::class);
}

以这种方式被视为数据透视表,第二个参数是数据透视表的表名。Subscriber

第三个参数是要在其上定义关系的模型的外键名称,而第四个参数是要联接到的模型的外键名称。在此处阅读更多内容

请考虑后面的子句,以仅筛选当前模型。wherebelongsToMany


推荐