Laravel множественные отношения - PullRequest
0 голосов
/ 17 сентября 2018

Я борюсь за создание отношений между двумя пивотами, которые разделяют одну модель.

Этими пивотами являются item_tag и playlist_tag.Ниже я описал таблицу и уже созданные отношения.

Таким образом, в настоящее время я могу получать элементы для списков воспроизведения, списки воспроизведения для элементов, теги для элементов, теги для списков воспроизведения.

What i 'Мне трудно сделать следующее:

  • Получить элементы, которые имеют те же теги, что и данный список воспроизведения
  • Получить списки воспроизведения, которые имеют те же теги, что и данный элемент

Я полагаю, что это может быть сделано с помощью 'manyThrough', но, честно говоря, я потерян.


Еще несколько подробностей отношений

  • Плейлист может состоять из множества элементов
  • Элементы могут принадлежать многим плейлистам
  • Поэтому элемент item_playlist pivot

Теги можно применять как к плейлистам, так и к элементам

  • Элемент может иметь много тегов
  • теги могут быть применены ко многим элементам
  • , так что элемент_tag pivot

  • В списке воспроизведения может быть много тегов *Теги 1041 *
  • могут быть применены ко многим спискам воспроизведения
  • , поэтому playlist_tag pivot

Пример структуры таблицы

   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();
    }
}

1 Ответ

0 голосов
/ 17 сентября 2018

Получение элементов, которые разделяют хотя бы один тег с данным списком воспроизведения:

$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();

Обратное направление работает так же.

...