首页 > 解决方案 > 从具有父关系条件的子项中选择唯一记录

问题描述

我有两张表,节目和剧集,每集都有 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 'where 子句'中的未知列'episodes.show_id'(SQL:select t.* from (SELECT * FROM episodes ORDER BY id DESC) t where exists (select * from showswhere episodes. show_id= shows. idand 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 获得第一条记录,我需要最新的

标签: laraveleloquent

解决方案


你可以试试这个

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

推荐阅读