你不能为mysql分组排序数据,所以你可以这样做:
对于 MYSQL 方式:
自动增量 ID:
每个集合的最新数据表示每个集合中的最大id。
所以你可以找到每个组中的所有max id,并使用子查询来获取所有这些记录:
$getDevice = Devices::whereIn('id', function($q) use ($id_project, $id_room) {
$q->from('devices')
->where('id_project', $id_project)
->where('id_room', $id_room)
->groupBy('mac_address')
->selectRaw('MAX(id) AS id');
})->get();
UUID:
因为 uuid 是无序字符串,所以可以通过mac_address 和max created_at 加入。并再次按mac_address分组,这样会得到最新的数据
$deviceQuery = Devices::where('id_project', $id_project)
->where('id_room', $id_room)
->groupBy('mac_address')
->select('mac_address', 'MAX(created_at) AS created_at');
$getDevice = Devices::joinSub($deviceQuery, 'dev', function($join) {
$join->on('dev.mac_address', '=', 'devices.mac_address')
->whereColumn('dev.created_at', 'devices.created_at');
})->groupBy('mac_address')
->get();
收款方式:
collection 会更易读,但是需要从 DB 中取出数据,然后过滤得到 group 中的最后一个数据。
$getDevice = Devices::where('id_project', $id_project)
->where('id_room', $id_room)
->get()
->groupBy('mac_address')
->map(function($items) {
return $items->sortByDesc('mac_address')->first();
})->values();