Как получить последние данные из каждой коллекции в Laravel - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу получить только одну последнюю информацию, отсортированную по created_at из каждой коллекции,

, теперь это мой код:

$getDevice = Devices::where('id_project', $id_project)
                          ->where('id_room', $id_room)
                          ->get()
                          ->groupBy(function($item){
                              return $item->mac_address;
                          });

 dd($getDevice);

, вывод:

output

Спасибо.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Вы можете использовать Devices :: latest () -> first (); Таким образом, вы можете построить запрос на следующем примере:

Devices::where('id_project', $id_project)
          ->where('id_room', $id_room)
          ->latest()->first();
0 голосов
/ 28 апреля 2020

Вы не можете заказать данные в группе для 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();
0 голосов
/ 27 апреля 2020

Попробуйте $ model-> orderBy ('column', 'des c') -> first ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...