Ситуация
У меня есть следующие модели:
Post
Video
Tag
Они хранятся в таблицах базы данных:
posts
(со столбцамиid
иname
)videos
(со столбцамиid
иname
)tags
(со столбцамиid
иname
)
А также таблица taggables
со столбцами:
tag_id
(идентификаторTag
)taggable_id
(идентификаторPost
илиVideo
)taggable_type
(либоApp\Post
, либоApp\Video
)
Обе модели Post
и Video
имеют morphToMany
отношение к Tag
, используя:
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
И модель Tag
имеет обратные morphedByMany
отношения, установленные с:
public function posts()
{
return $this->morphedByMany('App\Post', 'taggable');
}
public function videos()
{
return $this->morphedByMany('App\Video', 'taggable');
}
(Пока это работает, и все точно так, как описано в Документы Laravel.)
Теперь, в дополнение к этому, у меня есть модель TagGroup
, которая имеет отношение One-to-Many
к Tag
, поэтому несколько тегов могут принадлежать группе тегов. (Для hasMany('App\Tag')
и belongsTo('App\TagGroup')
используется столбец tag_group_id
в таблице tags
.)
Вопрос
Как установить связь между моделью TagGroup
и моделями Post
и (отдельно) Video
? (Например, чтобы получить все сообщения, отмеченные тегами определенной группы.)
Я знаю, что есть hasManyThrough
, но, похоже, это не работает с полиморфными отношениями «многие ко многим» в качестве промежуточного звена. Или я что-то не так делаю?
Также есть определение пользовательских промежуточных таблиц с MorphPivot
и ->using()
, но в документации об этом очень неясно.
Можно ли это сделать без дополнительных плагинов/фреймворков?
hasManyThrough
отношений "многие ко многим" нет встроенного, то, насколько мне известно, нет и встроенного для таких полиморфных отношений. Вы явно можете создать какие-то методы для загрузки моделей групп тегов, но вы, скорее всего, не выиграете от жадной загрузки... - person Namoshek   schedule 11.04.2019