Выберите уникальные записи от ребенка с условием родительских отношений - PullRequest
0 голосов
/ 03 июля 2019

У меня есть две таблицы, Шоу и Эпизоды, в каждом эпизоде ​​есть show_id, связывающий их один ко многим.

Теперь мне нужно получить последние 6 эпизодов, по одному на шоу, где show.active - true

Я пробовал следующий код:

$episodes = Episode::select(DB::raw('t.*'))
        ->from(DB::raw('(SELECT * FROM episodes ORDER BY id DESC) t'))
        ->whereHas('show', function($query) {
            $query->where('active', '=', true);
        })
        ->groupBy('t.show_id')
        ->take(6)
        ->get();

К сожалению, я получаю следующее:

Столбец не найден: 1054 Неизвестный столбец 'episodes.show_id' в 'предложении where'(SQL: выберите t. * Из (SELECT * FROM эпизодов ORDER BY id DESC) t где существует (выберите * из shows, где episodes. show_id = shows. id и active = 1) сгруппировать по t. show_id предел 6)

Я также пробовал:

$episodes = Episode::where('active', true)
        ->orderBy('id', 'DESC')
        ->whereHas('show', function($query) {
            $query->where('active', '=', true);
        })
        ->groupBy('show_id')
        ->take(6)
    ->get();

Это не показывает ошибки, но не возвращает последнее из каждого шоу, groupByполучает первую запись, мне нужна последняя

Ответы [ 3 ]

0 голосов
/ 03 июля 2019

Вы можете попробовать это

$episodes = Episode::selectRaw('max(id) as id, show_id')
                ->whereHas('show', function($query) {
                    $query->where('active', '=', true);
                })
                ->orderBy('id', 'DESC')
                ->groupBy('show_id')
                ->take(6)
                ->get();
0 голосов
/ 03 июля 2019

Вы можете использовать WHERE IN подзапрос:

$ids = Episode::selectRaw('max(id)')
    ->whereHas('show', function ($query) {
        $query->where('active', '=', true);
    })->groupBy('show_id');

$episodes = Episode::whereIn('id', $ids)
    ->take(6)
    ->get();
0 голосов
/ 03 июля 2019

Это должно работать:

            $episodes = Episode::where('active', true)
                ->whereHas('show', function($query) {
                    $query->where('active', '=', true);
                })
                ->groupBy('show_id')
                ->orderBy('id', 'DESC')
                ->take(6)
            ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...