每组按 updated_at 排序

Ordering by updated_at per group

我有以下简单查询来尝试获取每个 module 的最后更新行:

    $distincts = SerialNumber::where('company_id', Auth::user()->active_company_id)
        ->groupBy('module')
        ->orderBy('updated_at', 'desc')
        ->get();

这不符合我的要求。 module 组中的每一行都不会按 updated_at(这是一个日期时间戳)排序。

如何对组中的每一行使用 orderBy?感谢阅读!

下面的方法有效,但这是一个非常糟糕的解决方案:

    $distincts = array();

    $modules = SerialNumber::select('module')
        ->where('company_id', Auth::user()->active_company_id)
        ->groupBy('module')
        ->pluck('module');

    foreach ($modules as $mod) {
        $se = SerialNumber::where('company_id', Auth::user()->active_company_id)
            ->where('module', $mod)
            ->orderBy('updated_at', 'desc')
            ->first();

        $distincts[] = $se;
    }

你需要的是一个子查询:

$query = SerialNumber::orderBy('updated_at', 'desc')->getQuery();

$distincts = DB::table(DB::raw("(". $query->toSql() . ") as subQuery"))
    ->where('company_id', Auth::user()->active_company_id)
    ->groupBy('module')
    ->get();

这使得您只能获取组中的最新记录。