Comment grouper une collection par jour, mois et année dans Laravel

Mis à jour il y a 1 an

Un tutoriel pour regrouper les données d'une collection par date (jours, mois et année) dans un projet Laravel

Wilo Ahadi

Auteur

Wilo A.

Technologies

Laravel, PHP

🌎 La version anglaise de cette publication : How to group a collection by day, month and year in Laravel

Une collection du framework PHP Laravel est une classe qui peut être utilisée pour manipuler des ensembles de données. Elle fournit des méthodes pour travailler avec des tableaux de données et des objets, permettant de les filtrer, les grouper, les trier et les manipuler de manière efficace.

Dans ce tutoriel, nous voulons voir comment regrouper les données d'une collection en jours, mois et année. Pour ce faire, nous allons utiliser les méthodes groupBy() de la collection et format() de la librairie Carbon qui permet de manipuler les dates et les heures.

Considérons une collection d'utilisateurs App\Models\User.php que nous pouvons obtenir à l'aide de l'instruction suivante :

$users = User::all(); // La collection des utilisateurs

// $users = User::orderBy("created_at")->get(); // La collection des utilisateurs ordonnée par le champ "created_at"

Pour chaque utilisateur, nous disposons d'une date de création (created_at) de type timestamp que nous pouvons exploiter pour regrouper les données de la collection selon un format de date :

$users_grouped = $users->groupBy(function ($item, $key) {

    return $item->created_at->format('d-m-Y');

});

Dans ce code source, nous avons :

  1. La méthode groupBy() qui regroupe les éléments de la collection. Elle prend en paramètre une fonction anonyme qui donne accès à chaque élément ou $item de la collection.
  2. Pour chaque $item, nous formatons la date created_at en d-m-Y (jour-mois-année) en utilisant la méthode format(). Les formats acceptés sont décrits dans la documentation de datetime.

📄 Notez-bien : Les attributs created_at et updated_at des modèles de Laravel sont des objets Illuminate\Support\Carbon par défaut. Si vous utilisez un autre champ temporel dans votre modèle et que vous voulez l'exploiter et le traiter comme un objet Carbon, vous pouvez le convertir en utilisant la propriété $casts du modèle :

protected $casts = [
    "exemple_date" => "datetime",
];

Enfin, nous pouvons afficher la collection regroupée par date sur vue Blade de cette façon :

<ul>
@foreach ($users_grouped as $date_group)
	<li>
		{{ $date_group->first()->created_at->format('d-m-Y') }}
		<ul>
		@foreach ($date_group as $user)
			<li>{{ $user->name }}</li>
		@endforeach
		</ul>
	</li>
@endforeach
</ul>

Voici un exemple de résultat que ce code source peut afficher dans le navigateur :

Une liste de noms ordonnée par date

Portez-vous bien 😎

Cette publication vous a plu ?
Partagez-la avec vos ami(e)s sur les réseaux sociaux.

Wilo Ahadi

Wilo Ahadi, l'auteur

Passionné de l'informatique, je suis spécialiste en techniques des systèmes et réseaux, développeur web et mobile, infographiste et designer, ... J'aime partager mon expérience en formant sur la plateforme Akili School

Voir profil

Commentaires