Взаимосвязь нескольких стержней в Laravel

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

Речь идет об элементах item_tag и playlist_tag. Ниже я описал таблицу и уже созданные отношения.

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

Я изо всех сил пытаюсь сделать следующее:

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

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


Еще немного подробностей об отношениях

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

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

  • У предмета может быть много тегов
  • теги можно применять ко многим элементам
  • итак, сводка item_tag

  • В плейлисте может быть много тегов
  • теги можно применять ко многим плейлистам
  • так что точка playlist_tag

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

   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();
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Frank 18.09.2018 10:17

staudenmeir, я пробовал это, и это не сработало, пока я не удалил '=', $tags->count(), для чего это было?

Frank 18.09.2018 11:11
'=', $tags->count() гарантирует, что элемент разделяет теги все со списком воспроизведения. Без этой части он выбирает элементы, которые разделяют теги хотя бы один со списком воспроизведения.
Jonas Staudenmeir 18.09.2018 11:57

О'кей, в этом есть смысл. Я действительно хочу вернуть товары, у которых есть какие-либо теги. Было бы здорово, если бы вы могли обновить свой ответ обоими и объяснением, чтобы, когда я приму его, люди знали, что происходит. Спасибо за помощь!

Frank 18.09.2018 12:01

Я предполагал, что вы ищете полные совпадения. Я обновил свой ответ.

Jonas Staudenmeir 18.09.2018 12:14

Другие вопросы по теме