Задать вопрос
@AleDv

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

Всем привет. Есть две модели фильмы(Movie) и жанры (Genre). Фильмы связаны с жанрами по связи belongsToMany с pivot таблицей genre_movie.

Задача: найти все фильмы, с заданными id жанров.

Делаю так:
$movies = Movie::with('genres')
            ->whereHas('genres', function ($query) use ($ids) {
                foreach ($ids as $id) {
                    $query->where('genre_movie.genre_id', $id);
                }
            })
            ->get();


В таком варианте я всегда получаю пустую выборку. Если же вместо массива $ids, передать только одно значение, то получаю все фильмы по этому жанру.

$movies = Movie::with('genres')
            ->whereHas('genres', function ($query) use ($id) {
                    $query->where('genre_movie.genre_id', $id);
            })
            ->get();


Если же вернуть перечисление всех id, то результат пустой. В этом случае запрос выглядит так:
select * from `movies` where exists (select * from `genres` inner join `genre_movie` on `genres`.`id` = `genre_movie`.`genre_id` where `movies`.`id` = `genre_movie`.`movie_id` and `genre_movie`.`genre_id` = ? and `genre_movie`.`genre_id` = ?)


Не понимаю, в чем проблема? Наверняка какую-то мелочь упускаю, подскажите, пожалуйста.
  • Вопрос задан
  • 104 просмотра
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
Попробуйте заменить цикл с where на один whereIn в замыкании.
Ответ написан
New_Horizons
@New_Horizons
Бред:
Не уверен, но попробуйте так:
$genresIds = [1, 2];

$movies = Movie::whereHas('genres', function ($q) use ($genresIds) {

	$q->whereIn('id', $genresIds);

}, '=', count($genresIds))
	->get();

dd($movies);


Единственное, будут возвращаться и фильмы, которые содержат доп. жанр. Пример:
У фильма 3 жанра: Комедия, Драма, Ужасы, но нужно получить фильмы по фильтру Комедия, Ужасы. Этот фильм тоже вернётся. Но мне кажется нормальное поведение для Вашей задачи?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы