Полиморфные отношения 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');
}

И я хочу, чтобы все пользователи через модель подписчика, чтобы уведомить их, как

Уведомление :: отправить ($ topic-> users, new Notification ($ topic));

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

Есть идеи?

2

Решение

// Тематическая модель

пользователи публичных функций ()
{
return $ this-> hasManyThrough ('App \ User', 'App \ Subscriber', 'subscribable_id') -> где ('subsable_type', array_search (static :: class, Relation :: morphMap ())?: static :: учебный класс);
}

полиморфный hasManyThrough отношения такие же, как и любые другие, но с дополнительным ограничением на subscribable_type, который можно получить из Relation::morphMap() массив или используя имя класса напрямую.

5

Другие решения

В дополнение к подходу Мэтта, следующий код также может быть другим решением:

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

В этом случае Subscriber рассматривается как сводная таблица, а вторым аргументом является имя таблицы для сводной таблицы.

Третий аргумент — это имя внешнего ключа модели, для которой вы определяете отношение, а четвертый аргумент — это имя внешнего ключа модели, к которой вы присоединяетесь. Прочитайте больше Вот.

Рассмотрим where пункт после belongsToMany фильтровать только текущую модель.

0

Хорошо, у меня есть лучшее решение

// Subscriber Model

use Notifiable;

public function receivesBroadcastNotificationsOn()
{
return 'App.User.' . $this->user_id;
}// Send Notification

Notification::send($post->subscribers, new TestNotification($post));
-1
По вопросам рекламы [email protected]