Vorrei recuperare l'ultimo file inserito nella mia tabella. So che il metodo first()esiste e ti fornisce il primo file nella tabella ma non so come ottenere l'ultimo inserimento.
Vorrei recuperare l'ultimo file inserito nella mia tabella. So che il metodo first()esiste e ti fornisce il primo file nella tabella ma non so come ottenere l'ultimo inserimento.
Risposte:
Dovrai ordinare per lo stesso campo che stai ordinando ormai, ma in ordine decrescente. Ad esempio, se hai un timestamp al termine del caricamento chiamato upload_time, faresti qualcosa del genere;
Per Pre-Laravel 4
return DB::table('files')->order_by('upload_time', 'desc')->first();
Per Laravel 4 e successivi
return DB::table('files')->orderBy('upload_time', 'desc')->first();
Per Laravel 5.7 e versioni successive
return DB::table('files')->latest('upload_time')->first();
Ciò ordinerà le righe nella tabella dei file in base al tempo di caricamento, all'ordine decrescente e prenderà la prima. Questo sarà l'ultimo file caricato.
orderBy, nonorder_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();Ordina per data funziona più a lungo perché la data è stringa e molto probabilmente non indicizzata. Mentre la chiave primaria è indicizzata e funziona molto velocemente. Anche se creato_at indicizzato, è stringa indicizzata e non INT in caso di primario. La stringa di indice ha prestazioni inferiori.
orderBy('created_at', 'desc')non ti dà l'ultima riga. Esempio: 3 righe possono avere esattamente lo stesso valore TIMESTAMP e con orderBy('created_at', 'desc')te otterrai il primo dei 3 (che non è necessariamente l'ultima riga)
Utilizza immediatamente l'ambito più recente fornito da Laravel.
Model::latest()->first();
In questo modo non stai recuperando tutti i record. Una scorciatoia più piacevole da ordinare.
created_atcolonna generata automaticamente ($timestamps = true)nel modello, ma può essere disabilitato a piacimento, quindi si avrebbe un errore se non definito
Non hai mai menzionato se stai usando Eloquent, l'ORM predefinito di Laravel o meno. In caso affermativo, supponiamo che tu desideri ottenere l'ultima voce di una tabella utente, di Created_at, probabilmente potresti fare come segue:
User::orderBy('created_at', 'desc')->first();
Prima ordina gli utenti in base al campo Created_at, in ordine decrescente, quindi prende il primo record del risultato.
Ciò restituirà un'istanza dell'oggetto Utente, non una raccolta. Naturalmente, per sfruttare questa alternativa, devi avere un modello utente, che estende la classe Eloquent. Questo può sembrare un po 'confuso, ma è davvero facile iniziare e ORM può essere davvero utile.
Per ulteriori informazioni, consulta la documentazione ufficiale che è piuttosto ricca e ben dettagliata.
Per ottenere i dettagli dell'ultimo record
Model::all()->last(); oModel::orderBy('id', 'desc')->first();Per ottenere l'ultimo ID record
Model::all()->last()->id; o Model::orderBy('id', 'desc')->first()->id;Le collezioni Laravel hanno il metodo ultimo
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
Questo è il modo migliore per farlo.
all()metodo carica effettivamente tutti gli elementi. Questo non funzionerà su una tabella con milioni di record.
last()restituisce una singola istanza Eloquent e non una Collezione, e invocare pluck()equivale a chiamare Model::all()->pluck('name'), restituendo quindi l' nameattributo di tutte le righe nella tabella
Prova questo :
Model::latest()->get();
Puoi utilizzare l'ultimo ambito fornito da Laravel con il campo che desideri filtrare, supponiamo che verrà ordinato per ID, quindi:
Model::latest('id')->first();
Quindi, in questo modo, puoi evitare di ordinare per created_atcampo di default su Laravel.
Per ottenere i dettagli dell'ultimo record, utilizzare il codice seguente:
Model::where('field', 'value')->get()->last()
Un altro modo fantasioso per farlo in Laravel 6.x (Incerto ma deve funzionare anche per 5.x):
DB::table('your_table')->get()->last();
Puoi anche accedere ai campi:
DB::table('your_table')->get()->last()->id;
get()metodo prenderà tutto da your_tablee genererà una raccolta e il last()metodo otterrà l'ultimo elemento da quella raccolta. Quindi avrai già tutti i dati della tabella caricati in memoria (errato). Dovresti semplicemente usare `DB :: table ('items') -> latest () -> first ();` dietro la scena esegue `orderBy ($ column, 'desc')` e recupera il primo record.
Model($where)->get()->last()->id
Se stai cercando la riga effettiva che hai appena inserito con Laravel 3 e 4 quando esegui un'azione saveo createsu un nuovo modello come:
$user->save();
-o-
$user = User::create(array('email' => 'example@gmail.com'));
quindi l'istanza del modello inserita verrà restituita e potrà essere utilizzata per ulteriori azioni come il reindirizzamento alla pagina del profilo dell'utente appena creato.
La ricerca dell'ultimo record inserito funziona su un sistema a basso volume funzionerà quasi sempre, ma se si devono inserire inserimenti contemporaneamente, si può finire per interrogare per trovare il record sbagliato. Questo può davvero diventare un problema in un sistema transazionale in cui è necessario aggiornare più tabelle.
In qualche modo tutto quanto sopra non sembra funzionare per me in laravel 5.3, quindi ho risolto il mio problema usando:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
spero di riuscire a salvare qualcuno.
essere consapevoli del fatto che last(), latest()non sono deterministiche se siete alla ricerca di un sequenziale o di un evento / registrazione ordinato. Gli ultimi / recenti record possono avere lo stesso created_attimestamp esatto e ciò che si ottiene non è deterministico. Così orderBy(id|foo)->first(). Altre idee / suggerimenti su come essere deterministici sono i benvenuti.