Eloquent Filtering, un package pour faciliter l’implémentation d’une recherche sur des models

13 novembre 2024 - Modifié le 2 décembre 2024

Gérer des filtres complexes dans Laravel peut rapidement alourdir votre code. Avec Eloquent Filtering, simplifiez vos requêtes en automatisant la logique de recherche et de filtrage. Ce package vous permet de créer des filtres dynamiques pour vos modèles Eloquent, rendant votre code plus propre ...

Dans le cadre du développement d’applications avec Laravel, la gestion des filtres pour les requêtes Eloquent peut devenir rapidement complexe, notamment lorsque vous gérez des ensembles de données volumineux ou des fonctionnalités de recherche avancées. C’est là qu’intervient le package Eloquent Filtering, qui simplifie la création de filtres dynamiques sur vos modèles Eloquent en fonction des données d’une requête HTTP entrante. Ce package offre une manière plus lisible, maintenable et extensible de gérer vos requêtes de filtrage.

Qu’est-ce que Eloquent Filtering ?

Eloquent Filtering permet aux développeurs de filtrer dynamiquement les modèles en fonction des données de la requête. Au lieu de devoir chaîner manuellement plusieurs conditions de requête, le package abstrait ce processus, rendant votre code plus propre et maintenable.

Ce package est particulièrement utile lorsque vous développez des API, des tableaux de bord, ou des systèmes de recherche avancés. Il vous aide à automatiser et à organiser efficacement la logique de recherche et de filtrage, tout en garantissant que votre code reste modulable et facile à étendre.

Exemple de base

Voici un exemple simple d’utilisation du package avec un modèle Product. Le filtre autorise ici uniquement la recherche par le champ name avec un type de filtre EQUAL :


class Product extends Model implements IsFilterable
{
    use Filterable;

    public function allowedFilters(): AllowedFilterList
    {
        return Filter::only(
            Filter::field('name', [FilterType::EQUAL]),
        );
    }
}

$products = Product::filter([
    [
        'target' => 'name',
        'type'   => '$eq',
        'value'  => 'TV'
    ]
])->get();

Dans cet exemple, le filtre recherche tous les produits dont le nom est « TV ». Cela simplifie grandement la gestion de la logique de filtrage tout en conservant un code facile à lire.

Filtrage de champs et de relations

Un des points forts de Eloquent Filtering est sa capacité à filtrer non seulement les champs de base, mais aussi les relations entre modèles. Supposons que vous souhaitiez non seulement filtrer sur le nom d’un produit, mais également sur le nom de son fabricant. Voici comment vous pouvez mettre cela en place :


class Product extends Model implements IsFilterable
{
    use Filterable;

    public function allowedFilters(): AllowedFilterList
    {
        return Filter::only(
            Filter::field('name', [FilterType::EQUAL]),
            Filter::relation('manufacturer', [FilterType::HAS])->includeRelationFields()
        );
    }

    public function manufacturer(): HasOne
    {
        return $this->hasOne(Manufacturer::class);
    }
}

class Manufacturer extends Model implements IsFilterable
{
    use Filterable;

    public function allowedFilters(): AllowedFilterList
    {
        return Filter::only(
            Filter::field('name', [FilterType::EQUAL])
        );
    }
}

$filters = [
    [
        'target' => 'name',
        'type'   => '$eq',
        'value'  => 'TV',
    ],
    [
        'type'   => '$has',
        'target' => 'manufacturer',
        'value'  => [
            [
                'type'   => '$eq',
                'target' => 'name',
                'value'  => 'Sony',
            ]
        ]
    ]
];

$sql = Product::filter($filters)->toRawSql();

Ce filtre permet de rechercher tous les produits nommés « TV » dont le fabricant est « Sony ». Le code généré sera une requête SQL optimisée, avec une jointure entre les tables products et manufacturers pour vérifier que le nom du fabricant est bien « Sony ».


SELECT *
FROM "products"
WHERE "products"."name" = 'TV'
  AND EXISTS (
    SELECT *
    FROM "manufacturers"
    WHERE "products"."manufacturer_id" = "manufacturers"."id"
      AND "manufacturers"."name" = 'Sony'
  )

Pourquoi utiliser Eloquent Filtering ?

Ce package propose une bibliothèque de filtres complète, permettant de filtrer des champs simples, des relations, des colonnes JSON, des pivots, et bien plus encore. Il permet aussi de valider les filtres, de créer des filtres personnalisés, et de gérer de manière granulaire les types de filtres que vous souhaitez appliquer.

Fonctionnalités principales :

  • Bibliothèque étendue de filtres : De nombreux filtres prêts à l’emploi.

  • Filtres sur les relations : Filtrez en fonction de l’existence ou de la non-existence de relations.

  • Validation des filtres : Ajoutez une couche de validation pour vos filtres.

  • Filtres personnalisés : Créez vos propres filtres pour répondre à des besoins spécifiques.

  • Alias : Utilisez des alias pour les champs et les relations.

Conclusion

Le package Eloquent Filtering est un outil puissant pour simplifier vos requêtes de filtrage, particulièrement dans les projets où des recherches complexes sont nécessaires. Que ce soit pour des API, des interfaces de gestion de données, ou des outils de recherche, ce package vous aide à maintenir un code propre et évolutif. Pour les développeurs Laravel souhaitant gérer efficacement de grandes bases de données et créer des recherches avancées, Eloquent Filtering est un must-have.

Merci de votre lecture 😎

Ecrit par
Alyson Paya

Recevez par mail toute l’actualité de Mink

En cliquant sur "Ok", vous acceptez les CGU ainsi que notre politique de confidentialité décrivant la finalité des traitements de vos données personnelles.

Découvrez d'autres articles