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!