symfony - symfony - 使用多个复选框过滤 manytomany
问题描述
我想根据多个复选框的多对多关系过滤结果。
我有 2 个实体。1)“属性” 2)“视图”。在属性中,视图 arraycollection 正在添加一个基于视图实体的 manytomany 字段。
现在我根据视图的值制作了一个多复选框表单(我现在做了手动)。这显示在表格中。但是我不知道如何根据复选框过滤结果。
作为 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();
解决方案
我想我现在开始工作了。我循环遍历 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);
}
推荐阅读
- c# - 抓枪在捡起时不会成为我玩家的孩子
- database - Cypress 中与 SQLite 数据库的示例数据库连接
- python - 有没有办法从 python 中的另一个函数参数引用一个函数参数?
- c++ - OpenCV haarcascades加载根本不起作用
- java - java InputStream 可以连续从方法中读取数据吗?
- python - 在python中优化阶乘函数
- oracle - (Oracle)有条件地跳过扫描表
- c++ - 链接器找不到重载的运算符
- php - 在 PHP 中获取函数变量
- amazon-web-services - Scala Spark 从 AWS S3 读取 - com.amazonaws.SdkClientException:无法从服务端点加载凭证