从具有父母关系条件的孩子中选择唯一记录

时间:2019-07-03 09:46:45

标签: laravel eloquent

我有两个表,分别是Shows和Episodes,每个情节都有show_id,将它们一对多链接。

现在我需要获取最新的6集,每个节目一个,其中show.active是真的

我尝试了以下代码:

$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'where子句'中的未知列'episodes.show_id'(SQL:从(SELECT * FROM Episodes OR ID BY DESC)中选择t。*从(shows中选择*其中episodesshow_id = showsidactive = 1)按t分组。show_id限制6)< / p>

我也尝试过:

$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 :(得分:0)

这应该有效:

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

答案 1 :(得分:0)

您可以尝试

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

答案 2 :(得分:0)

您可以使用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();