Laravel: ottieni l’ultima voce di ogni tipo di UID

Ho una tabella che contiene centinaia di voci per oltre 1000 prodotti diversi, ciascuno identificato da un UID univoco.

ID UID MANY COLUMNS CREATED AT 1 dqwdwnboofrzrqww1 ... 2018-02-11 23:00:43 2 dqwdwnboofrzrqww1 ... 2018-02-12 01:15:30 3 dqwdwnbsha5drutj5 ... 2018-02-11 23:00:44 4 dqwdwnbsha5drutj5 ... 2018-02-12 01:15:31 5 dqwdwnbvhfg601jk1 ... 2018-02-11 23:00:45 6 dqwdwnbvhfg601jk1 ... 2018-02-12 01:15:33 ... 

Voglio essere in grado di ottenere l’ultima voce per ogni UID.

 ID UID MANY COLUMNS CREATED AT 2 dqwdwnboofrzrqww1 ... 2018-02-12 01:15:30 4 dqwdwnbsha5drutj5 ... 2018-02-12 01:15:317 6 dqwdwnbvhfg601jk1 ... 2018-02-12 01:15:33 

È ansible in una chiamata DB?

Ho provato a utilizzare DB e Eloquent ma finora ho ottenuto zero risultati o l’intero contenuto della tabella.

Andy

Questo è abbastanza facile da gestire in MySQL:

 SELECT t1.* FROM yourTable t1 INNER JOIN ( SELECT UID, MAX(created_at) AS max_created_at FROM yourTable GROUP BY UID ) t2 ON t1.UID = t2.UID AND t1.created_at = t2.max_created_at; 

Tradurre questo su Eloquent sarebbe un po ‘di lavoro, ma spero che questo ti dia un buon punto di partenza.

Modifica: potresti voler usare LEFT JOIN se ti aspetti che created_at possa mai essere NULL e che un dato UID possa avere solo valori nulli creati.

Puoi utilizzare un self join per selezionare l’ultima riga per ogni UID

 select t.* from yourTable t left join yourTable t1 on t.uid = t1.uid and t.created_at < t1.created_at where t1.uid is null 

Utilizzando il generatore di query di laravel sarebbe simile a

 DB::table('yourTable as t') ->select('t.*') ->leftJoin('yourTable as t1', function ($join) { $join->on('t.uid','=','t1.uid') ->where('t.created_at', '<', 't1.created_at'); }) ->whereNull('t1.uid') ->get(); 

Laravel Eloquent seleziona tutte le righe con max created_at

Laravel Eloquent group dal record più recente

SELECT p1. * FROM product p1, product p2 where p1. CREATED_AT > p2. Gruppo CREATED_AT di p2.UID

Puoi orderBy() con eloquent usando orderBy() e groupBy() :

 $data = TblModel::orderBy('id','DESC')->groupBy('uid')->get(); 

RISOLTO

Grazie a Tim e M Khalid per le loro risposte. Mi ha portato lungo la strada giusta ma ho trovato un problema, quindi perché sto pubblicando questa soluzione.

Questo ha funzionato:

  $allRowsNeeded = DB::table("table as s") ->select('s.*') ->leftJoin("table as s1", function ($join) { $join->on('s.uid', '=', 's1.uid'); $join->on('s.created_at', '<', 's1.created_at'); }) ->whereNull('s1.uid') ->get(); 

Comunque ho avuto una violazione di accesso quindi ho dovuto andare in config / database.php e impostare

 'strict' => false, 

all’interno della configurazione ‘mysql’, che rimuove ONLY_FULL_GROUP_BY da SQL_MODE.

Grazie ancora.

È necessario utilizzare ORDER BY e LIMIT parametri SQL, che ti porteranno a una semplice richiesta SQL:

per esempio, in SQL dovresti avere qualcosa di simile a questo:

 SELECT * FROM table_name ORDER BY `created_at` desc LIMIT 1 

Ciò restituirà tutto nella tabella. I risultati saranno ordinati in base alla colonna “created_at” in ordine decrescente. Quindi il primo risultato sarà quello che stai cercando. Quindi il “LIMIT” dice di restituire solo il primo risultato, quindi non avrai tutto il tuo database.

Se vuoi farlo con eloquenza, ecco il codice che fa la stessa cosa:

 $model = new Model; $model->select('*')->orderBy('created_at')->first();