symfony - отфильтруйте многотоманы с несколькими флажками - PullRequest
0 голосов
/ 01 мая 2019

Я хочу отфильтровать результаты по множеству взаимосвязей с несколькими флажками.

У меня есть 2 лица. 1) «свойства» 2) «взгляды». Где в свойствах массив массива вида добавляется с множеством полей, основанных на объекте вида.

Теперь я создал форму множественного флажка, основанную на значениях представлений (на данный момент я сделал это вручную). Это проявляется в форме. Однако я не знаю, как отфильтровать результаты по флажкам.

В качестве hmtl formoutput я получаю следующие несколько полей ввода с элементом массива

<input type="checkbox" name="form[viewchoices][]" value=1">
<input type="checkbox" name="form[viewchoices][]" value=2">
<input type="checkbox" name="form[viewchoices][]" value=2">

Я сейчас пытаюсь отфильтровать в контроллере запрос. Сначала получите данные

    $views = array();
    $views["viewchoices"] = $form["viewchoices"]->getData();

а потом я пытаюсь сделать фильтр

 if ($views["viewchoices"]) {
            $pagination->innerJoin('a.propviews', 'd')
                    ->addSelect('d');

            foreach ($views['viewchoices'] as $view)
            {
            $pagination->andWhere('d.id like :view')
             ->setParameter('view', $view);
            }

Я отображаю вывод с помощью knp paginator. Когда я пытаюсь отфильтровать, я получаю сообщение об ошибке «Слишком мало параметров: запрос определяет 5 параметров, но вы ограничиваете только 4». Но я не думаю, что мой код оптимален. Есть идеи, как это сделать? Заранее спасибо!


обновленный код: У меня есть несколько полей фильтра. При наличии нескольких флажков другие поля игнорируются.

        $pagination = $propertyRepo->createQueryBuilder('a');
           $pagination->Where('a.draft = 1')


       if($location != NULL) {
        $pagination->innerJoin('a.proplocation', 'b')
            ->addSelect('b')
            ->andWhere('b.id like :location')
                ->setParameter('location', $location);
        }

       if($type != NULL) {
        $pagination->innerJoin('a.proptype', 'c')
        ->addSelect('c')
            ->andWhere('c.id like :type')
                ->setParameter('type', $type);
        }

 if ($views["viewchoices"]) {
            $pagination->innerJoin('a.propviews', 'd')
                    ->addSelect('d');

            foreach ($views['viewchoices'] as $view['viewchoices'])
            {
            $pagination->orWhere('d.id =' .(int)$view['viewchoices']);
            // ->setParameter('view', $view);
            }
}


 if ($rooms["roomchoices"]) {
            $pagination->innerJoin('a.proprooms', 'e')
                    ->addSelect('e');

            foreach ($rooms['roomchoices'] as $room['roomchoices'])
            {
            $pagination->orWhere('e.id =' .(int)$room['roomchoices']);
            // ->setParameter('view', $view);
            }
}
        $pagination->getQuery();

1 Ответ

1 голос
/ 02 мая 2019

Я думаю, теперь все заработало.Я зацикливаю операторы orwhere и связываю их вместе в операторе andwhere, так как у меня также есть другие фильтры везде.

 if ($facilities["facilities"]) {


            $orStatements = $pagination->expr()->orX();

            $pagination->innerJoin('a.propfacilities', 'f')
                    ->addSelect('f');

            foreach ($facilities['facilities'] as $facility['facilities'])
            {
            $orStatements->add($pagination->expr()->in('f.id', (int)$facility['facilities']));

            }

            $pagination->andWhere($orStatements);
}
...