サブスクライバーモデルがあります
// Subscriber Model
id
user_id
subscribable_id
subscribable_type
public function user()
{
return $this->belongsTo('App\User');
}
public function subscribable()
{
return $this->morphTo();
}
そしてトピックモデル
// Topic Model
public function subscribers()
{
return $this->morphMany('App\Subscriber', 'subscribable');
}
そして、私はすべてのユーザーにサブスクライバーモデルを介してもらい、次のように通知したいと思います
Notification :: send($ topic-> users、new Notification($ topic));
// Topic Model
public function users()
{
return $this->hasManyThrough('App\User', 'App\Subscriber');
}
何か案は?
//トピックモデル public function users() { return $ this-> hasManyThrough( 'App\User'、 'App\Subscriber '、' subscribable_id ')-> where(' subscribable_type '、array_search(static :: class、Relation :: morphMap())?: static :: class); }
多態的なhasManyThrough
関係は他の関係と同じですが、Relation::morphMap()
配列から、またはクラス名を直接使用して取得できるsubscribable_type
に制約が追加されています。 。
Mattのアプローチに加えて、次のコードも別の解決策になる可能性があります。
//Topic Model
public function users()
{
return $this->belongsToMany(User::class, 'subscribers', 'subscribale_id', 'user_id')
->where('subscribale_type', static::class);
}
このように、Subscriber
はピボットテーブルとして扱われ、2番目の引数はピボットのテーブル名です。
3番目の引数は、関係を定義しているモデルの外部キー名であり、4番目の引数は、参加しているモデルの外部キー名です。続きを読む ここ 。
現在のモデルのみをフィルタリングするには、where
の後のbelongsToMany
句を検討してください。