Мне сложно создать взаимосвязь между двумя опорами, которые используют одну модель.
Речь идет об элементах item_tag и playlist_tag. Ниже я описал таблицу и уже созданные отношения.
Таким образом, в настоящее время я могу получать элементы для списков воспроизведения, списки воспроизведения для элементов, теги для элементов, теги для списков воспроизведения.
Я изо всех сил пытаюсь сделать следующее:
Я считаю, что это можно сделать с помощью manyThrough, но, честно говоря, я заблудился.
Еще немного подробностей об отношениях
Теги можно применять как к плейлистам, так и к элементам
Пример структуры таблицы
Table : items
id
name
Table : playlists
id
name
Table : item_playlist
item_id
playlist_id
Table : tags
id
name
Table : item_tag
item_id
tag_id
Table : playlist_tag
playlist_id
tag_id
Пример структуры класса / отношения
class Playlist extends Model
{
public function items()
{
return $this->belongsToMany(Item::class)->withTimestamps();
}
public function tags()
{
return $this->belongsToMany(Tag::class)->withTimestamps();
}
}
...
class Item extends Model
{
public function playlists()
{
return $this->belongsToMany(Playlist::class)->withTimestamps();
}
public function tags()
{
return $this->belongsToMany(Tag::class)->withTimestamps();
}
}
...
class Tag extends Model
{
public function items()
{
return $this->belongsToMany(Item::class)->withTimestamps();
}
public function playlists()
{
return $this->belongsToMany(Playlist::class)->withTimestamps();
}
}






Получение элементов, которые разделяют тег хотя бы один с заданным списком воспроизведения:
$tags = $playlist->tags()->pluck('id');
$items = Item::whereHas('tags', function($query) use($tags) {
$query->whereIn('id', $tags);
})->get();
Получение элементов, которые разделяют теги все с заданным списком воспроизведения:
$tags = $playlist->tags()->pluck('id');
$items = Item::whereHas('tags', function($query) use($tags) {
$query->whereIn('id', $tags);
}, '=', $tags->count())->get();
Обратное направление работает точно так же.
staudenmeir, я пробовал это, и это не сработало, пока я не удалил '=', $tags->count(), для чего это было?
'=', $tags->count() гарантирует, что элемент разделяет теги все со списком воспроизведения. Без этой части он выбирает элементы, которые разделяют теги хотя бы один со списком воспроизведения.
О'кей, в этом есть смысл. Я действительно хочу вернуть товары, у которых есть какие-либо теги. Было бы здорово, если бы вы могли обновить свой ответ обоими и объяснением, чтобы, когда я приму его, люди знали, что происходит. Спасибо за помощь!
Я предполагал, что вы ищете полные совпадения. Я обновил свой ответ.
ах, возможно, я просто слишком усложнил это в своей голове. Я думал, что есть красноречивый способ добиться того же. Просто подожду и посмотрю, есть ли у кого-нибудь другое решение и отметит его как правильное.