You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将分组取最新的MySQL查询转为Laravel Eloquent以支持模型关联

实现方案

方法1:使用joinSub语法(推荐,Laravel 5.6及以上版本支持)

该写法完全贴合你提供的原生SQL逻辑,返回结果为ruang_tt模型实例集合,可直接调用模型定义的关联方法:

use Illuminate\Support\Facades\DB;

// 构造子查询:获取每个id_nama_ruang对应的最新更新时间
$latestRuangSub = ruang_tt::select('id_nama_ruang', DB::raw('max(tgl_pengubahan) as MaxDate'))
    ->groupBy('id_nama_ruang');

// 主查询关联子查询过滤结果
$data = ruang_tt::select('tb_ruang_tt.*')
    ->joinSub($latestRuangSub, 'tm', function ($join) {
        $join->on('tb_ruang_tt.id_nama_ruang', '=', 'tm.id_nama_ruang')
            ->on('tb_ruang_tt.tgl_pengubahan', '=', 'tm.MaxDate');
    })->get();

方法2:兼容低版本Laravel写法

如果你的Laravel版本低于5.6没有joinSub方法,可以使用原生表达式拼接join部分:

use Illuminate\Support\Facades\DB;

$data = ruang_tt::select('tb_ruang_tt.*')
    ->join(
        DB::raw('(select id_nama_ruang, max(tgl_pengubahan) as MaxDate from tb_ruang_tt group by id_nama_ruang) tm'),
        function ($join) {
            $join->on('tb_ruang_tt.id_nama_ruang', '=', 'tm.id_nama_ruang')
                ->on('tb_ruang_tt.tgl_pengubahan', '=', 'tm.MaxDate');
        }
    )->get();

注意事项

  • 请先确认你的ruang_tt模型中已正确绑定对应数据表,在模型类中添加如下属性:
    protected $table = 'tb_ruang_tt';
    
  • 若需要预加载关联避免N+1查询问题,可在查询末尾追加with()方法,示例:->with('你定义的关联方法名')。

内容的提问来源于stack exchange,提问作者Harits Zeastank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 06:54:03