Группа Laravel Eloquent по последней записи
Я пытаюсь получить самую последнюю запись для одного клиента на столе. Пример:
ID Customer City Amount
1 Cust001 City1 2
2 Cust001 City2 3
3 Cust001 City1 1
4 Cust001 City2 1
5 Cust001 City2 3
6 Cust001 City3 1
7 Cust001 City3 1
8 Cust002 City1 2
9 Cust002 City1 1
10 Cust002 City2 3
11 Cust002 City1 2
12 Cust002 City2 1
13 Cust002 City3 2
14 Cust002 City3 3
15 Cust003 City1 1
16 Cust003 City2 3
17 Cust003 City3 2
Обратите внимание, что в таблице также есть поля create_at и updated_at. Я пропустил эти поля для простоты.
В конце я хочу, чтобы мой запрос вернулся для Cust001:
ID Customer City Amount
3 Cust001 City1 1
5 Cust001 City2 3
7 Cust001 City3 1
И для Cust002:
ID Customer City Amount
11 Cust002 City1 2
12 Cust002 City2 1
14 Cust002 City3 3
Я пробовал:
Table::where('Customer', 'Cust001')
->latest()
->groupBy('City')
->get()
а также
Table::select(DB::raw('t.*'))->from(DB::raw('(select * from table where Customer = \'Cust001\' order by created_at DESC) t'))
->groupBy('t.City')->get();
Но он продолжает возвращать самую старую запись в каждой группе (и я хочу самую последнюю).
Как мне этого добиться? Если вам, ребята, проще, вы можете написать SQL-запрос здесь, и я найду способ "перевести его" в синтаксис Laravel.
2 ответа
Чтобы получить последнюю запись среди клиентов для каждого города на основе created_at
Вы можете использовать самостоятельное соединение
DB::table('yourTable as t')
->select('t.*')
->leftJoin('yourTable as t1', function ($join) {
$join->on('t.Customer','=','t1.Customer')
->where('t.City', '=', 't1.City')
->whereRaw(DB::raw('t.created_at < t1.created_at'));
})
->whereNull('t1.id')
->get();
В простом SQL это было бы что-то вроде
select t.*
from yourTable t
left join yourTable t1
on t.Customer = t1.Customer
and t.City = t1.City
and t.created_at < t1.created_at
where t1.id is null
Другой подход с самостоятельным внутренним объединением будет
select t.*
from yourTable t
join (
select Customer,City,max(ID) ID
from yourTable
group by Customer,City
) t1
on t.Customer = t1.Customer
and t.City = t1.City
and t.ID = t1.ID
DB::table('table')->orderBy('id', 'desc')->get();
Laravel-запрос для получения последних данных на основе идентификатора