如何将分组取最新的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
相关产品推荐
相关产品推荐

