Вы не можете заказать данные в группе для mysql, поэтому вы можете сделать это следующим образом:
FOR MYSQL WAY:
AUTO INCREAMENT 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();
Для способа сбора данных:
Сбор данных будет более читабельным, однако для этого необходимо вынуть данные из БД, а затем фильтр, чтобы получить последние данные в группе.
$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();