如何使用Laravel Eloquent实现按天分组查询每日最新值
原SQL转Laravel Eloquent实现方法
基础对应写法(完全匹配原SQL逻辑)
前提是你已经创建了对应forex表的Eloquent模型Forex,且引入了DB门面:
use Illuminate\Support\Facades\DB; $dailyRecords = Forex::select(DB::raw('MAX(timestamp) as max_timestamp, value')) ->groupBy(DB::raw("FROM_UNIXTIME(timestamp, '%Y%m%d')")) ->get();
更稳妥的兼容写法
原SQL在开启MySQL默认的ONLY_FULL_GROUP_BY模式时会抛出语法错误,因为value字段既没有出现在GROUP BY子句中,也没有被聚合函数包裹,推荐使用子查询关联的方式实现,结果更准确、兼容性更强:
use Illuminate\Support\Facades\DB; // 子查询获取每天最大的时间戳 $dailyMaxTimestampSub = Forex::select(DB::raw('MAX(timestamp) as max_timestamp')) ->groupBy(DB::raw("FROM_UNIXTIME(timestamp, '%Y%m%d')")); // 关联原表拿到对应时间戳的完整记录 $dailyRecords = Forex::joinSub($dailyMaxTimestampSub, 'daily_max', function ($join) { $join->on('forex.timestamp', '=', 'daily_max.max_timestamp'); })->get(['forex.timestamp', 'forex.value']);
注意事项
- 以上写法针对MySQL数据库,如果使用其他数据库请替换
FROM_UNIXTIME为对应数据库的时间戳转日期函数 - Laravel 8及以上版本模型默认命名空间为
App\Models\Forex,低版本为App\Forex,请根据自己的项目版本调整
内容的提问来源于stack exchange,提问作者Wahsei
相关产品推荐
相关产品推荐

