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.
Réponses
Trop de publicités?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é.
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.
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.
- Réponses précédentes
- Plus de réponses