Je souhaite 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 du tableau mais je ne sais pas comment obtenir le dernier insert.
Je souhaite 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 du tableau mais je ne sais pas comment obtenir le dernier insert.
Réponses:
Vous devrez classer par le même champ que vous commandez maintenant, mais en ordre décroissant. Par exemple, si vous avez un horodatage lorsque le téléchargement a été appelé upload_time
, vous feriez quelque chose comme ceci;
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 versions ultérieures
return DB::table('files')->latest('upload_time')->first();
Cela ordonnera les lignes de la table des fichiers par heure de téléchargement, ordre décroissant et prendra la première. Ce sera le dernier fichier téléchargé.
orderBy
, pasorder_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
Trier par date fonctionne plus longtemps car la date est une chaîne et probablement non indexée. Alors que la clé primaire est indexée et fonctionne très rapidement. Même si created_at est indexé, il s'agit d'une chaîne indexée et non de INT en cas de primaire. La chaîne d'index a moins de performances.
orderBy('created_at', 'desc')
ne vous donne pas la dernière ligne. Exemple: 3 lignes peuvent avoir exactement la même valeur TIMESTAMP et avec orderBy('created_at', 'desc')
vous obtiendrez la première des 3 (qui n'est pas nécessairement la dernière ligne)
Utilisez la dernière portée fournie par Laravel hors de la boîte.
Model::latest()->first();
De cette façon, vous ne récupérez pas tous les enregistrements. Un raccourci plus agréable pour orderBy.
created_at
colonne auto-générée ($timestamps = true)
dans le modèle, mais peut être désactivée à souhait pour que vous ayez une erreur si non définie
Vous n'avez jamais mentionné si vous utilisiez Eloquent, l'ORM par défaut de Laravel ou non. Dans le cas où vous l'êtes, disons que vous voulez obtenir la dernière entrée d'une table User, par created_at, vous pourriez probablement faire comme suit:
User::orderBy('created_at', 'desc')->first();
Tout d'abord, il classe les utilisateurs par champ created_at, par ordre décroissant, puis il prend le premier enregistrement du résultat.
Cela vous renverra une instance de l'objet User, pas 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 déroutant, mais il est vraiment facile de commencer et ORM peut être vraiment utile.
Pour plus d'informations, consultez la documentation officielle qui est assez riche et bien détaillée.
Pour obtenir les détails du dernier enregistrement
Model::all()->last();
ouModel::orderBy('id', 'desc')->first();
Pour obtenir l'identifiant du dernier enregistrement
Model::all()->last()->id;
ou Model::orderBy('id', 'desc')->first()->id;
Les collections Laravel ont la dernière méthode
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
C'est la meilleure façon de procéder.
all()
méthode charge en fait tous les éléments. Cela ne fonctionnera pas sur une table avec des millions d'enregistrements.
last()
renvoie une seule instance Eloquent et non une collection, et appeler pluck()
cela équivaut à appeler Model::all()->pluck('name')
, donc renvoyer l' name
attribut de toutes les lignes de la table
Essaye ça :
Model::latest()->get();
Vous pouvez utiliser la dernière portée fournie par Laravel avec le champ que vous souhaitez filtrer, disons qu'il sera trié par ID, puis:
Model::latest('id')->first();
Ainsi, vous pouvez éviter de commander par created_at
champ par défaut chez Laravel.
Pour obtenir les détails du dernier enregistrement, utilisez le code ci-dessous:
Model::where('field', 'value')->get()->last()
Une autre façon sophistiquée de le faire dans Laravel 6.x (Incertain mais doit également fonctionner pour 5.x):
DB::table('your_table')->get()->last();
Vous pouvez également accéder aux champs:
DB::table('your_table')->get()->last()->id;
get()
méthode récupérera tout your_table
et générera une collection et la last()
méthode obtiendra le dernier élément de cette collection. Donc, vous aurez déjà toutes les données de la table chargées sur votre mémoire (mauvaise). Vous devez simplement utiliser `DB :: table ('items') -> latest () -> first ();` derrière la scène, il exécute `orderBy ($ column, 'desc')` et récupère le premier enregistrement.
Si vous recherchez la ligne réelle que vous venez d'insérer avec Laravel 3 et 4 lorsque vous effectuez une action save
ou create
sur un nouveau modèle comme:
$user->save();
-ou-
$user = User::create(array('email' => 'example@gmail.com'));
puis l'instance de modèle insérée sera retournée et pourra être utilisée pour d'autres actions telles que la redirection vers la page de profil de l'utilisateur qui vient d'être créé.
La recherche du dernier enregistrement inséré fonctionne sur un système à faible volume fonctionnera presque tout le temps, mais si jamais vous devez insérer des insertions en même temps, vous pouvez finir par interroger pour trouver le mauvais enregistrement. Cela peut vraiment devenir un problème dans un système transactionnel où plusieurs tables doivent être mises à jour.
D'une manière ou d'une autre, tout ce qui précède ne semble pas fonctionner pour moi dans laravel 5.3, j'ai donc résolu mon propre problème en utilisant:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
j'espère pouvoir renflouer quelqu'un.
soyez conscient que last()
, latest()
ne sont pas déterministes si vous recherchez un enregistrement séquentiel ou événement / ordonné. Les derniers enregistrements / récents peuvent avoir exactement le même created_at
horodatage, et que vous récupérez n'est pas déterministe. Alors fais orderBy(id|foo)->first()
. D'autres idées / suggestions sur la façon d'être déterministe sont les bienvenues.