Symfony2 / Doctrine: SQL to DQL для построителя запросов в репозитории, чтобы создать форму поиска

В моем проекте с Symfony мне нужно создать форму поиска с мультикритерией. У меня есть выбор для объекта Parc, выбор для объекта Typeactivite и входной текст для Ensembles.

У меня есть этот запрос SQL :

SELECT distinct e.nom FROM `ensembles` e, `parcsimmobilier` p, `batiments` b, `batiments_typesactivite` bta, `typesactivite` ta WHERE e.parcsimmobilier_id=p.id AND b.ensembles_id=e.id AND bta.batiments_id=b.id AND bta.typesactivite_id = ta.id AND p.nom="Ville de Dijon" AND ta.type="Sport" 

Этот запрос SQL дает мне все ансамбли, которые принадлежат к Парку Дижона, где у баталий есть Спорт для деятельности.

Я попытался преобразовать этот запрос SQL в синтаксисе DQL в моем EnsemblesRepository.php, но это не дает мне хорошего результата, я думаю, что я делаю это неправильно:

 public function recherche($input) //$input est la valeur entrée dans l'input type text recherche { $qb = $this ->createQueryBuilder('e') ->select('e.nom') ->addSelect('e.parcsimmobilier') ->from('MySpaceDatabaseBundle:Parcsimmobilier', 'p') ->from('MySpaceDatabaseBundle:Typesactivite', 'ta') ->from('MySpaceDatabaseBundle:Batiments', 'b') ->where('e.parcsimmobilier = p.id') ->andWhere('b.ensembles=b.id') ->andWhere('ta.batiments=b.id') ->andWhere('e.nom LIKE :input') ->setParameters(array( 'input' => "%".$input."%")); return $qb->getQuery()->getResult(); } 

Когда я отправлю форму, у меня есть следующие ошибки:

[2/2] QueryException: строка [Semantical Error] 0, col 16 около «parcsimmobilier»: ошибка: неверное выражение пути. Должно быть выражение StateFieldPathExpression.

[1/2] QueryException: SELECT e.nom, e.parcsimmobilier FROM MySpace \ DatabaseBundle \ Entity \ Ensembles e, MySpaceDatabaseBundle: Parcsimmobilier p, MySpaceDatabaseBundle: Typesactivite ta, MySpaceDatabaseBundle: Batiments b WHERE e.parcsimmobilier = p.id AND b. ансамбли = b.id AND ta.batiments = b.id И e.nom LIKE: ввод

Как я могу сделать запрос DQL в моем репозитории?

Это форма поиска, которую я отправляю для поиска в моем суде. Ансамбли:

 class RechercheType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder //Parcsimmobilier ->add('parcs:', 'entity', array( 'class' => 'MySpaceDatabaseBundle:Parcsimmobilier', 'property' => 'nom', 'empty_value' => 'Choisir le parc immobilier', 'required' => true)) //Typesactivite ->add('typesactivite:', 'entity', array( 'class' => 'MySpaceDatabaseBundle:Typesactivite', 'property' => 'type', 'empty_value' => 'Choisir le type d\'activite', 'required' => false)) //Ensembles ->add('ensemble', 'text', array( 'attr' => array('placeholder' => 'rechercher'), 'required' => false)) ; 

ОБНОВИТЬ

Для моего контроллера есть мой код, если он может помочь:

 public function rechercheEnsemblesAction() { $formRecherche = $this->createForm(new RechercheType()); //si la méthode est bien en POST if ($this->get('request')->getMethod() == 'POST' ) { $formRecherche->bind($this->get('request')); $em=$this->getDoctrine()->getManager(); $ensemble = $em ->getRepository('MySpaceDatabaseBundle:Ensembles') ->recherche($formRecherche['ensemble'] ->getdata()); } return $this->render('MySpaceGestionPatrimoinesBundle:Ensembles:rechercheEnsembles.html.twig', array('ensemble' => $ensemble, 'formRecherche' => $formRecherche->createView() )); } 

Давайте попробуем сделать запрос шаг за шагом .

В теге select я могу выбрать имя parcs ( требуется в моей форме), без ввода значения в тексте ввода для имени ансамбля . Мой запрос SQl находится на phpMyAdmin :

 SELECT distinct e.nom FROM `ensembles` e, `parcsimmobilier` p where e.parcsimmobilier_id=p.id 

Этот запрос дает мне все ансамбли s, принадлежащие парку с идентификатором 1 .

В DQl я пытаюсь это сделать в моем репозитории EnsemblesRepository.php :

 public function recherche() //$input est la valeur entrée dans l'input type text recherche { $qb = $this ->createQueryBuilder('e') ->select('e.nom') ->from('MySpaceDatabaseBundle:Parcsimmobilier', 'p') ->where('e.parcsimmobilier = p.id') ->andWhere('e.nom LIKE :input') ->setParameters(array( 'input' => "%".$input."%")); return $qb->getQuery()->getResult(); } 

Но это не возвращает мне хороший результат. Результатом является все Ensemble в моей базе данных, даже если я выберу parc в моем теге select, создайте в моей форме.

Кто-то может помочь мне шаг за шагом?

Если вам нужна дополнительная информация, это отношение между моими сущностями. Мне нужны только два класса / сущности.

Ensemnles.php :

 /** * @var \Parcsimmobilier * * @ORM\ManyToOne(targetEntity="Parcsimmobilier") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="parcsimmobilier_id", referencedColumnName="id") * }) */ private $parcsimmobilier; 

Batiments.php :

 /** * @ORM\ManyToOne(targetEntity="MySpace\DatabaseBundle\Entity\Ensembles") * @ORM\JoinColumn(nullable=false) */ private $ensembles; /** * @ORM\ManyToMany(targetEntity="MySpace\DatabaseBundle\Entity\Typesactivite") * @ORM\JoinColumn(nullable=true) */ private $typesactivite; 

Я действительно не могу найти решение, не стесняйтесь обращаться за дополнительной информацией, если вам нужно.

Спасибо за ваше понимание.

Solutions Collecting From Web of "Symfony2 / Doctrine: SQL to DQL для построителя запросов в репозитории, чтобы создать форму поиска"

Как я уже говорил вам, проверьте здесь JQuery datatables, для вашего проекта, если вы хотите управлять своими объектами в Symfony.

Затем вы можете использовать свой собственный запрос с Jquery, Ajax и Symfony, чтобы получить некоторые результаты для формы поиска в html <table> .

Это пример .js вы можете использовать для поиска в datatable:

 $(document).ready(function() { $('#dataTables').DataTable( { "dom": '<"toolbar">frtip', responsive: true, initComplete: function () { var api = this.api(); api.columns().indexes().flatten().each( function ( i ) { var column = api.column( i ); var select = $('<select><option value=""></option></select>') .appendTo( $(column.footer()).empty() ) .on( 'change', function () { var val = $.fn.dataTable.util.escapeRegex( $(this).val() ); column .search( val ? '^'+val+'$' : '', true, false ) .draw(); }); column.data().unique().sort().each( function ( d, j ) { select.append( '<option value="'+d+'">'+d+'</option>' ) }); }); } }); $("div.toolbar").html('<b>Example</b>'); }); 

И, конечно же, html (не забудьте структуру таблицы, используя DataTables, все шаги в doc => Для DataTables, чтобы иметь возможность улучшить таблицу HTML, таблица должна быть действительной, хорошо отформатированной HTML, с заголовком (thead) и тело (tbody). Также может использоваться необязательный нижний колонтитул (tfoot) .):

 <table id="dataTables" class="your class or bootstrap class if you are using bootstrap for example"> <thead> <tr> <th>Column 1</th> <th>Column 2</th> ...number you want... </tr> </thead> <tbody> <tr> <td>{{ entity.field }}</td> <td>{{ entity.field2 }}</td> ...etc.. </tr> </tbody> </table> 

Вы пытаетесь выбрать объект с псевдонимом. Если вы хотите выбрать скалярные поля, select('entity_alias.field') но если вы хотите выбрать сущность, вы просто укажете псевдоним таблицы. В вашем случае вам нужно выбрать «p» вместо «e.parcsimmobilier».

Кроме того, вы всегда должны присоединяться вместо использования нескольких операторов. Это также позволит вам отбросить те, где в качестве доктрины включены утверждения, в зависимости от вашей объектной модели, поэтому вам не нужно вручную писать идентификатор Id = id.