[英]Laravel Polymorphic Relations Has Many Through
我有一個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');
}
有任何想法嗎?
// 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
);
}
多態hasManyThrough
關系與任何其他關系相同,但對subscribable_type
增加了約束,可以從Relation::morphMap()
數組中檢索,或直接使用類名。
除了 Matt 的方法之外,以下代碼也可能是另一種解決方案:
//Topic Model
public function users()
{
return $this->belongsToMany(User::class, 'subscribers', 'subscribale_id', 'user_id')
->where('subscribale_type', static::class);
}
通過這種方式, Subscriber
被視為數據透視表,第二個參數是數據透視表的表名。
第三個參數是您在其上定義關系的模型的外鍵名稱,而第四個參數是您要加入的模型的外鍵名稱。 在這里閱讀更多。
考慮belongsToMany
之后的where
子句來僅過濾當前模型。
你所追求的不是hasManyThrough
,而是morphedByMany
。
當您有A
一對多B
、 B
一對多C
並且您想使用A
獲取多個C
時, hasManyThrough
很有用。
您擁有的是一個位於A
和C
中間的多態數據透視表。
// Topic Model
public function users()
{
return $this->morphedByMany('App\User', 'subscribable', 'pivot/subscriber_table_name');
}
文檔: https : //laravel.com/docs/6.x/eloquent-relationships#many-to-many-polymorphic-relations
試試這個包https://github.com/staudenmeir/eloquent-has-many-deep
那么你可以像這樣使用它:
class Topic extends Model
{
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function users()
{
return $this->hasManyDeep(
'App\User',
['App\Subscriber'],
[null, ['subscribable_type', 'subscribable_id']]
);
}
}
好的,我有一個更好的解決方案
// Subscriber Model
use Notifiable;
public function receivesBroadcastNotificationsOn()
{
return 'App.User.' . $this->user_id;
}
// Send Notification
Notification::send($post->subscribers, new TestNotification($post));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.