Поиск Laravel в сводной таблице с нумерацией страниц - PullRequest
0 голосов
/ 04 октября 2018

Мне нужно искать жанр демо.

Примечание: я скрыл другой поиск дрожания краткости.

Фон:

Таблицы:

  1. Пользователи [id, name,...]
  2. Демонстрации [id, name, user_id]
  3. Жанры [id, name]
  4. demo_genre (сводная таблица) [demo_id, genre_id]

Код

$user = (new User)->newQuery();
$user->with(['demos' =>function($query) {
    $query->whereHas('genres', function ($query) {
        $query->whereIn('genre_id',[2,3,4]);
    });
}]);


$user->paginate();

Примечание : приведенный выше код работает, если в результатах поиска есть данные.Но возвращает пустой массив демонстраций, если жанры не найдены в сводной таблице.

Вопрос : Как удалить результаты, которые не соответствуют заданному условию (то есть: $query->whereIn('genre_id',[2,3,4]);).И отобразите демонстрации, которые соответствуют условию.

Условия:

  1. Показать пользователя с демонстрациями [результаты, в которых есть демонстрации с genre_id в (2,3,4))]
  2. Показывать только демоверсию с genre_id в (2,3,4)
  3. Не показывать пользователю, если счет домо равен нулю

1 Ответ

0 голосов
/ 04 октября 2018

Я думаю, вам нужно only the users who has demos which has particular genres

$user->whereHas('demos', function($demoQuery) {
    $demoQuery->whereHas('genres', function ($genreQuery) {
        $genreQuery->whereIn('id',[2,3,4]);
    });
})
->with([
    'demos' => function($demoQuery) {
        $demoQuery->whereHas('genres', function ($genreQuery) {
            $genreQuery->whereIn('id',[2,3,4]);
        });
])
->get();

where() для фильтрации, with() для загрузки демоверсий загрузки.

...