Maison  >  Article  >  développement back-end  >  Comment récupérer les derniers enregistrements pour chaque valeur unique dans une colonne à l'aide de Laravel Eloquent ?

Comment récupérer les derniers enregistrements pour chaque valeur unique dans une colonne à l'aide de Laravel Eloquent ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 12:55:02702parcourir

How to Retrieve the Latest Records for Each Unique Value in a Column using Laravel Eloquent?

Comment obtenir toutes les lignes avec Max Created_at dans Laravel Eloquent

Dans l'ORM Eloquent de Laravel, vous pouvez rencontrer des scénarios dans lesquels vous devez récupérer les dernières lignes pour chaque valeur distincte dans une colonne particulière. Ceci peut être réalisé en utilisant une combinaison de sous-requêtes et de fonctions d'agrégation.

Considérons un scénario dans lequel vous disposez d'une table de base de données contenant les colonnes suivantes :

id  seller_id   amount   created_at

Supposons que vous souhaitiez obtenir la version la plus récente enregistrement pour chaque seller_id unique. Voici comment y parvenir à l'aide d'une requête SQL brute :

<code class="sql">select s.*
from snapshot s
left join snapshot s1 on s.seller_id = s1.seller_id
and s.created_at < s1.created_at
where s1.seller_id is null

Dans cette requête, nous utilisons une jointure gauche pour comparer chaque enregistrement de la table d'instantanés (alias s) avec tous les autres enregistrements ayant le même vendeur_id. Nous utilisons ensuite la condition AND pour filtrer les enregistrements où s.created_at est inférieur à s1.created_at. Enfin, nous incluons une clause WHERE pour exclure tous les enregistrements avec un seller_id correspondant dans la table de droite (s1), isolant ainsi le dernier enregistrement pour chaque seller_id.

Pour obtenir le même résultat en utilisant le générateur de requêtes Laravel, vous peut exécuter le code suivant :

<code class="php">DB::table('snapshot as s')
  ->select('s.*')
  ->leftJoin('snapshot as s1', function ($join) {
        $join->on('s.seller_id', '=', 's1.seller_id')
             ->whereRaw(DB::raw('s.created_at < s1.created_at'));
   })
  ->whereNull('s1.seller_id')
  ->get();</code>

Cette approche du générateur de requêtes reflète la logique de la requête SQL brute, en l'encapsulant dans l'interface fluide de Laravel. Il renvoie une collection des derniers enregistrements pour chaque seller_id distinct présent dans la table d'instantanés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn