【发布时间】:2019-09-20 09:13:36
【问题描述】:
我想根据多个复选框的多对多关系过滤结果。
我有 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 分页器渲染输出。 当我尝试过滤时出现错误“参数太少:查询定义了 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();
【问题讨论】:
-
foreach 循环中的部分看起来很奇怪。您的查询有一个参数
:viewchoices,但您设置了一个参数id。还有你的评论提到或在哪里,但你使用andWhere。您能否添加一个示例,生成的查询应该是什么样子? -
@dbrumann 哦哈哈,评论是复制过去的一部分(并且应该在哪里使用,因为它是一个多重的东西)。我稍微更新了我的代码,我没有收到错误,但它也没有过滤。是的,我不知道在哪里可以找到一个很好的例子。我对 foreachloop 不是很熟悉。
-
您确定要
andWhere吗?这将创建类似WHERE d.id LIKE 1 AND d.id LIKE 2 AND d.id LIKE 3...的东西,这对我来说没有多大意义。我认为您实际上在这里想要OR,或者类似... AND d.id IN (1,2,3,...)(这只是id = 1OR id = 2 OR...的一种奇特方式)。请添加您认为可行的示例 SQL 查询或有关模型和分页过程的更多详细信息,以便我们更全面地了解查询不会返回任何结果的原因。 -
@dbrumann haha with or where I do a list back :)。但我有更多过滤器选项(下拉/滑块等),现在似乎使用 orwhere 选项其他过滤器被忽略。让我更新代码以向您展示我所拥有的。我以以下为例顺便说一句github.com/lexik/LexikFormFilterBundle/issues/40
-
@dbrumann 现在我可以手动显示多个复选框(我只是在 de formbuilder 中添加选择选项),但我实际上想从集合数组中获取它。但是我不知道如何得到它。我也发布了一个问题。你还可以看到更多我的代码。也许你知道如何抓取collectionarray。感谢到目前为止。 stackoverflow.com/questions/55864386/…
标签: symfony checkbox filter many-to-many arraycollection