[Symfony] Utiliser un query builder spécifique dans le YAML EasyAdmin pour configurer les widgets de type entité

Publié le 07/05/2019 • Mis à jour le 07/05/2019

English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧

Quand on édite une entité avec le bundle EasyAdmin et que celle-ci a des relations avec d'autres entités, prfois, nous ne voulons pas afficher toutes les lignes possibles mais nous voulons filtrer celles pouvant être sélectionnées. Pour ce faire, on peut utiliser l'option query_builder du type Entity. On peut utiliser une fonction statique du repository de l'entité cible : celle-ci va automatiquement recevoir comme premier argument le repository de cette même entité. Dans cet exemple on exclut les entités ayant une date de début expirée.


# app/config/easy_admin.yml
easy_admin:
    # ...
    entities:
        Activity:
            class: EventBundle\Entity\Activity
            form:
                fields:
                    - { property: 'event', type: 'entity', type_options: { class: 'EventBundle\Entity\Event', required: true, multiple: false, query_builder: 'EventBundle\Entity\EventRepository::adminQueryBuilderForFeEvents' }, css_class: 'col-sm-6' }


<?php

// src/EventBundle/Entity/EventRepository.php

use Doctrine\ORM\QueryBuilder;

/**
 * Admin filter: don't display past events.
 */
public static function adminQueryBuilderForFeEvents(EventRepository $r): QueryBuilder
{
    return $r->createQueryBuilder('e')
       ->innerJoin('e.eventType', 'et')
       ->where('et.id = :event_type')
       ->setParameter('event_type', 1)
       ->andWhere('e.startDate > :now')
       ->setParameter('now', date_create())
       ->orderBy('e.id', 'DESC');
 }

 Plus sur Stackoverflow