254 votes

Sélectionner la dernière rangée du tableau

Je voudrais récupérer le dernier fichier inséré dans ma table. Je sais que la méthode first() existe et vous fournit le premier fichier de la table mais je ne sais pas comment obtenir le dernier insert.

329voto

Joachim Isaksson Points 85969

Vous devrez ordonner par le même champ que vous ordonnez maintenant, mais en ordre décroissant. Par exemple, si vous avez un horodatage de l'upload appelé upload_time vous feriez quelque chose comme ça ;

Pour Pre-Laravel 4

return DB::table('files')->order_by('upload_time', 'desc')->first();

Pour Laravel 4 et plus

return DB::table('files')->orderBy('upload_time', 'desc')->first();

Pour Laravel 5.7 et plus

return DB::table('files')->latest('upload_time')->first();

Cela permettra d'ordonner les rangées dans le tableau des fichiers par heure de téléchargement, ordre décroissant et prenez le premier. Ce sera le dernier fichier téléchargé.

214voto

Nick Points 1781

Utilisez la dernière portée fournie par Laravel dès le départ.

Model::latest()->first();

De cette façon, vous ne récupérez pas tous les enregistrements. Un raccourci plus agréable pour orderBy.

94voto

Luis Milanese Points 892

Vous n'avez pas précisé si vous utilisez Eloquent, l'ORM par défaut de Laravel, ou non. Si c'est le cas, disons que vous voulez obtenir la dernière entrée d'une table User, par created_at, vous pouvez probablement faire comme suit :

User::orderBy('created_at', 'desc')->first();

Tout d'abord, il ordonne les utilisateurs par champ created_at, de façon décroissante, puis il prend le premier enregistrement du résultat.

Cela vous renverra une instance de l'objet User, et non une collection. Bien sûr, pour utiliser cette alternative, vous devez avoir un modèle User, étendant la classe Eloquent. Cela peut sembler un peu confus, mais c'est très facile de commencer et l'ORM peut être très utile.

Pour plus d'informations, consultez le site documentation officielle qui est assez riche et bien détaillée.

64voto

Haseena P A Points 427

Pour obtenir les détails du dernier enregistrement

  1. Model::all()->last(); o
  2. Model::orderBy('id', 'desc')->first();

Pour obtenir l'identifiant du dernier enregistrement

  1. Model::all()->last()->id; o
  2. Model::orderBy('id', 'desc')->first()->id;

37voto

Maik Lowrey Points 106

Beaucoup de réponses et certaines où je ne suis pas tout à fait d'accord. Je vais donc résumer à nouveau mes commentaires.

Dans le cas où vous venez de créer un nouvel objet. Par défaut, lorsque vous créez un nouvel objet, Laravel retourne le nouvel objet.

$lastCreatedModel = $model->create($dataArray); 

dd($lastCreatedModel); // will output the new output
echo $lastCreatedModel->key; // will output the value from the last created Object

Il y a ensuite l'approche consistant à combiner les méthodes all() avec ( last() et first() ) sans condition.

Très mauvais ! Ne faites pas ça !

Model::get()->last();` // the most recent entry
Model::all()->last();` // the most recent entry

Model::get()->first();` // the oldest entry
Model::all()->first();` // the oldest entry

Ce qui est fondamentalement la mauvaise approche ! Vous get() all() les enregistrements, et dans certains cas, cela peut être 200 000 ou plus, et ensuite choisir une seule ligne. Ce n'est pas bon ! Imaginez que votre site reçoive du trafic de Facebook et qu'une requête de ce type apparaisse. En un mois, cela représenterait probablement les émissions de CO² d'une ville comme Paris en un an. Parce que les serveurs doivent travailler inutilement. Oubliez donc cette approche et si vous la trouvez dans votre code, remplacez-la ou réécrivez-la. Vous ne le remarquez peut-être pas avec 100 ensembles de données, mais avec 1000 et plus, cela peut être perceptible.

Très bien, ce serait :

Model::orderBy('id', 'desc')->last(); // the most recent record
Model::latest('id')->first(); // the most recent record
Model::latest('id')->limit(1)->get(); // the most recent record
Model::orderBy('id', 'desc')->limit(1)->get(); // the most recent entry
Model::orderBy('id', 'desc')->first(); // the most recent entry

Model::orderBy('id', 'asc')->first(); // the oldest entry
Model::orderBy('id', 'asc')->limit(1)->get(); // the oldest entry
Model::orderBy('id', 'asc')->first(); // the oldest entry

Si orderBy est utilisé dans ce contexte, la primarykey doit toujours être utilisée comme base et non create_at.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X