Laravel Eloquent group dal record più recente

Sto cercando di ottenere il record più recente per un singolo cliente su un tavolo. Esempio:

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 

Si noti che la tabella ha anche campi created_at e updated_at. Ho omesso quei campi per semplicità.

Alla fine voglio che la mia richiesta venga restituita per Cust001:

 ID Customer City Amount 3 Cust001 City1 1 5 Cust001 City2 3 7 Cust001 City3 1 

E per Cust002:

 ID Customer City Amount 11 Cust002 City1 2 12 Cust002 City2 1 14 Cust002 City3 3 

Ho provato:

 Table::where('Customer', 'Cust001') ->latest() ->groupBy('City') ->get() 

e anche

 Table::select(DB::raw('t.*'))->from(DB::raw('(select * from table where Customer = \'Cust001\' order by created_at DESC) t')) ->groupBy('t.City')->get(); 

Ma continua a restituire il record più vecchio di ogni gruppo (e voglio il più recente).

Come posso raggiungere questo objective? Se è più facile per voi ragazzi, potete scrivere qui SQL Query e troverò un modo per “tradurlo” nella syntax di Laravel.

Per ottenere l’ultimo record per cliente tra ciascuna città sulla base di created_at puoi utilizzare un self join

 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(); 

In semplice SQL sarebbe qualcosa di simile

 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 

dimostrazione

Un altro approccio con il self inner join sarebbe

 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 

dimostrazione

 DB::table('table')->orderBy('id', 'desc')->get(); 

Query di Laravel per ottenere gli ultimi dati sulla base dell’ID