Bonjour,
J'ai une table Client sur lequel existe un champ "parent_id", ce qui me permet de construire une hiérarchie simple entre clients, sur une seule table (relation one-to-many, auto-référente).
J'ai généré un CRUD Client. Sur mon formulaire, il me faut maintenant un select me permettant de sélectionner un client existant qui va devenir le parent du client en cours d'édition. Deux conditions : il faut que la liste du select ne contiennent que des clients dont le parent_id est à NULL (on ne veut une hiérarchie que à 2 niveau max) ET il faut bien sûr que le client en cours d'édition n'apparaisse pas dans cette liste.
J'ai donc voulu centraliser cette requête dans une méthode de mon ClientRepository. Elle ne me retourne pas les résultats d'une query mais juste un QueryBuilder (nécessaire pour le paramètre 'query_builder' lors de la création de mon form).
Voici le code de ma classe ClientType :
et voici la méthode de mon ClientRepository :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class ClientType extends AbstractType { public function buildForm(FormBuilder $builder, array $options) { $builder ->add('parent', 'entity', array( 'class' => 'MonApp\\ClientBundle\\Entity\\Client', 'query_builder' => function(EntityRepository $er) { return $er->getParentOnly( 2 ); }, )) ->add('nom') ->add('prenom');
Mon soucis : il faut que je passe l'id du client rattaché au formulaire lors de l'appel à $er->getParentOnly( 2 ); } (j'ai mis ici "2" en dur). Je peux accéder à l'id du client courant avec $builder->getData()->getId() (en supposant qu'il n'y a pas plus simple...) mais je n'arrive pas à passer ce paramètre dans ma closure.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 public function getParentOnly($notThisOne = null) { $queryBuilder = $this->createQueryBuilder('a'); $queryBuilder->where('a.parent IS NULL'); if($notThisOne != null) { $queryBuilder->andWhere('a.id != :notThisOne') ->setParameter('notThisOne', $notThisOne); } return $queryBuilder; }
Ce code fonctionne :
mais pas ceux-là (entre autres) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 'query_builder' => function(EntityRepository $er, notThisOne = 2) { return $er->getParentOnly( $notThisOne ); },
D'une manière générale, est-ce-que c'est la bonne méthode pour arriver au résultat que je veux ? Quelqu'un peut-il m'aiguiller pour mon passage de paramètre ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 'query_builder' => function(EntityRepository $er, notThisOne = $builder->getData()->getId() ) { return $er->getParentOnly( $notThisOne ); }, 'query_builder' => function(EntityRepository $er ) { return $er->getParentOnly( $builder->getData()->getId() ); },
D'avance, merci beaucoup
Partager