1111
1212namespace Symfony \UX \Autocomplete \Form ;
1313
14- use Doctrine \Common \Collections \ArrayCollection ;
1514use Doctrine \ORM \EntityManagerInterface ;
16- use Doctrine \ORM \Query \Parameter ;
1715use Doctrine \ORM \Utility \PersisterHelper ;
1816use Symfony \Bridge \Doctrine \Form \Type \EntityType ;
1917use Symfony \Component \EventDispatcher \EventSubscriberInterface ;
@@ -54,13 +52,15 @@ public function preSubmit(FormEvent $event)
5452 $ form = $ event ->getForm ();
5553 $ options = $ form ->get ('autocomplete ' )->getConfig ()->getOptions ();
5654
55+ /** @var EntityManagerInterface $em */
56+ $ em = $ options ['em ' ];
57+ $ repository = $ em ->getRepository ($ options ['class ' ]);
58+ $ queryBuilder = $ options ['query_builder ' ] ?: $ repository ->createQueryBuilder ('o ' );
59+ $ rootAlias = $ queryBuilder ->getRootAliases ()[0 ];
60+
5761 if (!isset ($ data ['autocomplete ' ]) || '' === $ data ['autocomplete ' ]) {
5862 $ options ['choices ' ] = [];
5963 } else {
60- /** @var EntityManagerInterface $em */
61- $ em = $ options ['em ' ];
62- $ repository = $ em ->getRepository ($ options ['class ' ]);
63-
6464 $ idField = $ options ['id_reader ' ]->getIdField ();
6565 $ idType = PersisterHelper::getTypeOfField ($ idField , $ em ->getClassMetadata ($ options ['class ' ]), $ em )[0 ];
6666
@@ -69,22 +69,23 @@ public function preSubmit(FormEvent $event)
6969 $ idx = 0 ;
7070
7171 foreach ($ data ['autocomplete ' ] as $ id ) {
72- $ params [":id_ $ idx " ] = new Parameter ( " id_ $ idx " , $ id , $ idType) ;
72+ $ params [":id_ $ idx " ] = [ $ id , $ idType] ;
7373 ++$ idx ;
7474 }
7575
76- $ queryBuilder = $ repository ->createQueryBuilder ('o ' );
77-
7876 if ($ params ) {
7977 $ queryBuilder
80- ->where (sprintf ("o. $ idField IN (%s) " , implode (', ' , array_keys ($ params ))))
81- ->setParameters (new ArrayCollection ($ params ));
78+ ->andWhere (sprintf ("$ rootAlias. $ idField IN (%s) " , implode (', ' , array_keys ($ params ))))
79+ ;
80+ foreach ($ params as $ key => $ param ) {
81+ $ queryBuilder ->setParameter ($ key , $ param [0 ], $ param [1 ]);
82+ }
8283 }
8384
8485 $ options ['choices ' ] = $ queryBuilder ->getQuery ()->getResult ();
8586 } else {
86- $ options ['choices ' ] = $ repository -> createQueryBuilder ( ' o ' )
87- ->where ( " o .$ idField = :id " )
87+ $ options ['choices ' ] = $ queryBuilder
88+ ->andWhere ( " $ rootAlias . $ idField = :id " )
8889 ->setParameter ('id ' , $ data ['autocomplete ' ], $ idType )
8990 ->getQuery ()
9091 ->getResult ();
0 commit comments