получать и отображать правильные данные с фильтрацией параметров маршрута и запросом доктрины

Для начала у меня есть этот запрос SQl:

SELECT  pc.id, pc.nom_point_comptage, e.id, e.nom_ensemble, p.id, p.nom_parc
FROM points_comptage pc , ensembles e , parcs_immobilier p
WHERE pc.ensembles_id = e.id
AND e.parcs_immobilier_id = p.id

Этот запрос позволяет мне получить points comptage, которые находятся в ensembles и принадлежат определенному parc.

Итак, в моем контроллере Symfony я создал DQL с доктриной. Это код контроллера:

/**
 *
 * @Route("/gestioncompteurs/pointscomptageByparcs", name="dataTablePointsComptageParc")
 * @Method("get")
 */
public function pointsComptageByParcAction($nomParc)
{
  $em=$this->getDoctrine()->getManager();

  $query = $em->createQuery('SELECT  p.nomParc, e.nomEnsemble, pc.invariantPointComptage /*and more like my SQL request...*/
                             FROM MySpaceMyBundle:ParcsImmobilier p, MySpaceMyBundle:Ensembles e, MySpaceMyBundle:PointsComptage pc
                               WHERE pc.ensembles = e.id
                               AND e.parcsImmobilier = p.id');

  $pointComptage = $query->getResult();

  return $this->render('MySpaceMyBundle:PointsComptage:dataTablePointsComptage.html.twig', array(
        'pointComptage' => $pointComptage));
}

Но в моей ветке сначала мне нужно отфильтровать по парку, поэтому я создаю тег выбора, в котором есть все мои парки, например:

<select class="form-control input" id="filterByParc" name="filterByParc">
  <option value="" disabled selected>sélectionnez un parc</option>
    {% for parcs in parc %}
      <option value="{{ path('dataTablePointsComptageParc', {'nomParc': parcs.nomParc}) }}">{{ parcs.nomParc }}</option>
    {% endfor %}
</select>

Как видите, значение для выбранных опций в моем теге select — это путь (url) для представления. Потому что мне нужно вернуть в javascript фильтрацию данных по выбранному мной парку (параметр маршрута).

Все работает хорошо, то есть мой контроллер и мой javascript правильно отображают мои данные, но без данных.

В phpMyAdmin мой запрос работает хорошо, но нет с Doctrine в моем контроллере.

Чтобы точно объяснить, что я пытаюсь сделать и что мне нужно:

первый: я выбираю название парка в теге select в своем представлении; во-вторых: мой выбор возвращает мне фильтрацию данных по названию моего парка, который я выбираю, поэтому данные в моей таблице должны принадлежать всем points comptage в моем ensembles parc, который я выбираю первым в выборе ярлык.

Кто-нибудь знает, где возникла моя проблема?


person french_dev    schedule 17.06.2015    source источник


Ответы (2)



Наконец-то я нашел логику фильтрации с помощью DQL и параметра маршрута.

См. мой код контроллера здесь:

/**
 *
 * @Route("/gestioncompteurs/pointscomptageByparcs", name="dataTablePointsComptageParc")
 * @Method("get")
 */
public function pointsComptageByParcAction($nomParc)
{
  $em=$this->getDoctrine()->getManager();

  $query = $em->createQuery("SELECT  p.nomParc, e.nomEnsemble, pc.invariantPointComptage /*and more like my SQL request...*/
                             FROM MySpaceMyBundle:ParcsImmobilier p, MySpaceMyBundle:Ensembles e, MySpaceMyBundle:PointsComptage pc
                               WHERE pc.ensembles = e.id
                               AND e.parcsImmobilier = p.id
                               AND p.nomParc = '$nomParc'");

  $pointComptage = $query->getResult();

  return $this->render('MySpaceMyBundle:PointsComptage:dataTablePointsComptage.html.twig', array(
        'pointComptage' => $pointComptage, 'parc' => $parc));
}

Мне нужно передать $nomParc в моем DQl, чтобы восстановить правильные данные, чтобы они соответствовали данным, которые я передаю в параметр маршрута.

person french_dev    schedule 17.06.2015
comment
Хорошо, но я бы посоветовал не делать это таким образом. Вы всегда должны использовать подготовленные операторы, чтобы смягчить внедрение SQL. Используйте 1_... - person Jovan Perovic; 17.06.2015
comment
Да, я вижу в документе, что на самом деле лучше использовать подготовленный оператор, я работаю над этим. - person french_dev; 17.06.2015