"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Tri des lignes avec des valeurs vides en bas et des valeurs non vides par ordre décroissant dans Laravel

Tri des lignes avec des valeurs vides en bas et des valeurs non vides par ordre décroissant dans Laravel

Publié le 2024-11-06
Parcourir:152

Sorting Rows with Empty Values at the Bottom and Non-Empty Values in Descending Order in Laravel

Lorsque vous travaillez avec des bases de données, il est courant de rencontrer des situations dans lesquelles certains champs peuvent être vides ou NULL. Un défi qui se pose souvent est de savoir comment trier les enregistrements de manière à ce que les lignes contenant des champs vides apparaissent en bas de l'ensemble de résultats, tandis que celles contenant des valeurs non vides soient classées de manière significative (par exemple, par ordre décroissant). Dans cet article, je vais vous montrer comment y parvenir dans Laravel à l'aide d'un exemple pratique.

Scénario

Disons que vous disposez d'un tableau de participants pour une activité et que chaque participant peut ou non avoir un horodatage Attend_at, qui enregistre le moment où le participant a assisté à l'activité. Vous souhaitez lister tous les participants, en les triant de telle manière que :

  • Les participants qui ont participé (c'est-à-dire que Attended_at n'est pas vide) apparaissent en premier, triés par participation la plus récente.
  • Les participants qui n'ont pas participé (c'est-à-dire que Attended_at est vide ou NULL) apparaissent en dernier.

Le problème

Par défaut, la méthode last() de Laravel trie les enregistrements par colonne donnée par ordre décroissant. Cependant, il ne gère pas le cas où certains enregistrements ont des valeurs NULL ou vides. Si vous utilisez simplement :

return $this
    ->participants()
    ->with('user')
    ->latest('attended_at')
    ->get();

Il classera les participants avec un horodatage, mais ne déplacera pas les valeurs NULL vers le bas.

La solution : utiliser orderByRaw

Nous pouvons réaliser le tri souhaité en utilisant la méthode orderByRaw(). Cela nous permet d'écrire une logique de tri personnalisée à l'aide d'expressions SQL brutes. Dans ce cas, nous trierons selon que Attend_at est NULL, puis trierons par Attend_at par ordre décroissant pour les valeurs non NULL.

Voici comment écrire cette requête dans Laravel :

return $this
    ->participants()
    ->with('user')
    ->orderByRaw('attended_at IS NULL, attended_at DESC')
    ->get()
    ->map(function (ActivityParticipant $participant) {
        return [
            'metric_number' => data_get($participant, 'user.student_id'),
            'name' => data_get($participant, 'user.name'),
            'status' => data_get($participant, 'status'),
            'attended_at' => data_get($participant, 'attended_at', '-'),
        ];
    })->toArray();

Décomposer la requête

  • orderByRaw('attended_at IS NULL, Attended_at DESC'):
    • attend_at IS NULL : cela renverra vrai (ou 1) pour les lignes où Attend_at est NULL et faux (ou 0) sinon. Cela place effectivement les valeurs NULL en bas.
    • attend_at DESC : après avoir traité les valeurs NULL, cela trie les lignes restantes avec des valeurs attend_at non vides par ordre décroissant, ce qui signifie que la participation la plus récente sera affichée en premier.

Résultat final

La fonction map() est ensuite utilisée pour formater la sortie dans la structure souhaitée, y compris des champs tels que l'id_étudiant, le nom et le statut, et pour convertir l'horodatage Attend_at en un format lisible par l'homme ou « - » s'il l'est. vide.

Avantages de cette approche

  • Performances : Cette approche exploite les capacités de tri de SQL, ce qui la rend efficace pour les grands ensembles de données.
  • Lisibilité : L'utilisation de orderByRaw() avec une expression SQL brute permet de conserver le code concis et facile à comprendre.
  • Flexibilité : Vous pouvez facilement étendre cette logique pour trier selon d'autres champs ou inclure des conditions plus complexes.

Conclusion

La gestion du tri avec des valeurs NULL ou vides dans Laravel est une tâche courante lorsque l'on travaille avec des données qui ne sont pas toujours complètes. En utilisant la méthode orderByRaw() avec une expression SQL telle que Attend_at IS NULL, Attend_at DESC, vous pouvez facilement vous assurer que les lignes avec des valeurs NULL apparaissent en bas tout en triant le reste des données de manière significative.

Cette méthode est particulièrement utile dans les scénarios où vous avez affaire à des présences, comme le montre cet exemple, mais elle peut être appliquée à de nombreuses autres situations dans lesquelles certains champs de données peuvent être manquants. Avec cette approche, vous pouvez offrir à vos utilisateurs un affichage plus clair et plus intuitif des enregistrements dans votre application.

Bon codage !

Déclaration de sortie Cet article est reproduit sur : https://dev.to/nasrulhazim/sorting-rows-with-empty-values-at-the-bottom-and-non-empty-values-in-descending-order-in-laravel- 2ao9? 1S'il y a une infraction, veuillez contacter [email protected] pour la supprimer
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3