Как получить связанную модель через сводную таблицу в Laravel?

у меня есть небольшая проблема в моем приложении Laravel 5.4, в моей базе данных у меня есть несколько объектов, которые связаны через центральную модель, называемую Content, например.

Actor     -> actors_contents     -> Content
Category  -> categories_contents -> Content

И затем у меня есть три других объекта, которые являются «содержимым», таким как видео, фото и т. д.

Video (content_id)  -> Content
Photo (content_id)  -> Content
Stream (content_id) -> Content

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

По сути, получите content_id для текущего актера из сводной таблицы, а затем найдите видео, которые ему соответствуют.

Я пытался использовать hasManyThrough, но почитав некоторое время, я обнаружил, что он не работает с отношениями «многие ко многим», поэтому мой вопрос: как я могу заставить это работать иначе? Я не хочу определять свои собственные отношения или что-то в этом роде, я мог бы создать метод в модели, который просто выполняет некоторые соединения, чтобы получить нужные мне значения, но имеет ли это последствия за кулисами по сравнению с Отношения Ларавеля?

Для одного

 ->with(['relation'])

Больше не будет работать с этими отношениями, и поэтому я не смогу загрузить их, и это может быть проблемой, так что, ребята, как бы вы решили эту проблему? Спасибо заранее за вашу помощь.


person JonnySerra    schedule 24.07.2017    source источник


Ответы (1)


Я хочу, например, иметь доступ ко всем видео для определенного актера.

Один из способов сделать это — использовать whereHas():

$actorName = 'John Travolta';
Video::whereHas('content', function ($q) use ($actorName) {
        $q->whereHas('actors', function ($q) use ($actorName) {
            $q->where('name', $actorName);
        });
    })->get();
person Alexey Mezenin    schedule 24.07.2017
comment
Это работает, но это означает, что я не могу загрузить отношения, и мне придется создать дополнительный класс-оболочку или репозиторий для этого пользовательского запроса, если нет другого варианта, тогда мне придется сделать это таким образом, но это неудачно - person JonnySerra; 25.07.2017
comment
@JonnySerra, вы можете загрузить данные. Просто добавьте with() к запросу. - person Alexey Mezenin; 25.07.2017