symfony-过滤带有多个复选框的manytomany

时间:2019-05-01 20:37:40

标签: symfony checkbox filter many-to-many arraycollection

我想基于具有多个复选框的多方关系来过滤结果。

我有2个实体。 1)“属性” 2)“视图”。在属性中的某个位置,将添加一个基于视图实体的视图数组集合,其中包含许多字段。

现在,我根据视图的值创建了一个multiplecheckbox表单(我现在将其设置为manuel)。这以表格形式显示。但是我不知道如何根据复选框过滤结果。

作为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分页器渲染输出。 当我尝试过滤时,出现错误“参数太少:查询定义了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 个答案:

答案 0 :(得分:1)

我认为我现在可以正常工作了。我遍历orwhere语句,并在andwhere语句中将其绑定在一起,因为我还具有其他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);
}