Symfony Publié le

Filtrer sur les propriétés d'une entité liée avec EasyAdmin

EasyAdmin 5.8 devine le type d'un filtre posé sur une propriété liée (« patient.contact.pays ») : plus besoin de le déclarer.

Notions abordées : EasyAdminDoctrine

Nouveau dans EasyAdmin 5.8. EasyAdmin savait déjà filtrer sur la propriété d'une entité liée, ou d'un objet embarqué Doctrine, avec la notation pointée. Mais il fallait déclarer soi-même le type de chaque filtre. Depuis la 5.8, il lit le mapping Doctrine de la propriété visée et devine son type, comme il le faisait déjà pour les propriétés de l'entité elle-même.

Avant

public function configureFilters(Filters $filters): Filters
{
    return $filters
        ->add(TextFilter::new('author.fullName'))
        ->add(TextFilter::new('author.address.country'));
}

Depuis EasyAdmin 5.8

public function configureFilters(Filters $filters): Filters
{
    return $filters
        // « author » est une association de l'entité Book
        ->add('author.fullName')
        // « address » est un objet embarqué de l'entité Author
        ->add('author.address.country');
}

Le type deviné suit la colonne : un TextFilter pour une chaîne, un NumericFilter pour un nombre, un EntityFilter pour une association. Les filtres de date posés sur une propriété liée lisent eux aussi ce mapping : sur une colonne de type date, un DateTimeFilter propose un champ date, et non plus un champ date et heure. Déclarer le filtre soi-même ne sert plus qu'à choisir un autre type ou à régler ses options.

À faire

Le back-office d'un cabinet médical liste ses consultations avec, pour chacune, le nom, le pays et la date de naissance du patient. Ses filtres déclarent encore leur type à l'ancienne, et la date de naissance n'en a pas.

Dans ConsultationCrudController, réduisez les deux filtres existants à leur nom de propriété, puis ajoutez de la même façon un filtre sur patient.dateDeNaissance. La liste ne doit pas changer, et chaque filtre doit garder le libellé de la colonne qui lui correspond.