Laravel中如何从数据库获取去重日期并仅显示日期部分?
Laravel GPS追踪历史:每日最新条目获取与日期格式化方案
问题背景
基于Laravel Jetstream + Inertia.js开发车辆GPS追踪系统,包含Fleet(车辆)、Tracker(追踪器)、History(位置历史)三个模型。当前实现可展示特定车辆的所有追踪日期,但存在两个问题:
- 单日期存在多条重复条目,需仅保留每日最新的一条记录
- 时间戳显示完整格式(如
2022-08-18 09:21:06),希望仅展示日期部分(如2022-08-18)
解决方案
1. 修改HistoryController查询逻辑
通过子查询获取每日最新记录,并生成格式化日期字段:
class HistoryController extends Controller { public function index(Request $request) { $fleet = Fleet::findOrFail($request->id); $imei = $fleet->tracker->value('imei'); // 子查询:按日期分组,获取每个日期的最新记录时间 $latestDailyRecords = DB::table('history') ->select(DB::raw('DATE(created_at) as date, MAX(created_at) as latest_created_at, imei')) ->where('imei', $imei) ->groupBy(DB::raw('DATE(created_at)'), 'imei'); // 关联原表,获取每日最新的完整记录,并生成格式化日期 $history = DB::table('history') ->joinSub($latestDailyRecords, 'daily_latest', function ($join) { $join->on('history.created_at', '=', 'daily_latest.latest_created_at') ->on('history.imei', '=', 'daily_latest.imei'); }) ->select('history.*', DB::raw('DATE(history.created_at) as formatted_date')) ->get(); return Inertia::render('FleetView', [ 'fleet' => $fleet, 'history' => $history ]); } }
2. 修正History模型关联关系
原模型中tracker()关联逻辑错误,History属于Tracker,应改为belongsTo并指定关联字段:
class History extends Model { use HasFactory; protected $table = 'history'; protected $fillable = [ 'id', 'imei', 'lat', 'lng', 'speed', 'msg_type', 'time', 'date', 'unknown_char', 'created_at', 'payload' ]; public function tracker() { // 指定关联字段:History的imei对应Tracker的imei return $this->belongsTo(Tracker::class, 'imei', 'imei'); } }
3. 前端使用格式化日期
在Inertia的FleetView组件中,直接调用formatted_date字段展示日期,替代完整的created_at时间戳。
内容的提问来源于stack exchange,提问作者user19949912
相关产品推荐
相关产品推荐

