web-dev-qa-db-ja.com

Laravelポリモーフィックな関係には多くのスルーがあります

サブスクライバーモデルがあります

// 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');
}

何か案は?

13
Edward
 //トピックモデル
 
 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に制約が追加されています。 。

5
Matt Hanley

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句を検討してください。

0
Khalil Laleh