У меня есть модель подписчика
// 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');
}
И я хочу, чтобы все пользователи через модель подписчика, чтобы уведомить их, как
Уведомление :: отправить ($ topic-> users, new Notification ($ topic));
// Topic Modelpublic function users()
{
return $this->hasManyThrough('App\User', 'App\Subscriber');
}
Есть идеи?
// Тематическая модель пользователи публичных функций () { return $ this-> hasManyThrough ('App \ User', 'App \ Subscriber', 'subscribable_id') -> где ('subsable_type', array_search (static :: class, Relation :: morphMap ())?: static :: учебный класс); }
полиморфный hasManyThrough
отношения такие же, как и любые другие, но с дополнительным ограничением на subscribable_type
, который можно получить из Relation::morphMap()
массив или используя имя класса напрямую.
В дополнение к подходу Мэтта, следующий код также может быть другим решением:
//Topic Model
public function users()
{
return $this->belongsToMany(User::class, 'subscribers', 'subscribale_id', 'user_id')
->where('subscribale_type', static::class);
}
В этом случае Subscriber
рассматривается как сводная таблица, а вторым аргументом является имя таблицы для сводной таблицы.
Третий аргумент — это имя внешнего ключа модели, для которой вы определяете отношение, а четвертый аргумент — это имя внешнего ключа модели, к которой вы присоединяетесь. Прочитайте больше Вот.
Рассмотрим where
пункт после belongsToMany
фильтровать только текущую модель.
Хорошо, у меня есть лучшее решение
// Subscriber Model
use Notifiable;
public function receivesBroadcastNotificationsOn()
{
return 'App.User.' . $this->user_id;
}// Send Notification
Notification::send($post->subscribers, new TestNotification($post));