首页 > 解决方案 > 如何制作基于请求查找属性的查询构建器

问题描述

我在 symfony4 中有一个房地产网络应用程序,并且我有 db sql 结构:表(请求 - 任何客户都可以请求购买房产,属性 - 实际建筑物,字段 - 用于自定义表单的动态字段类型,如电流,电视, AC 和 FieldValues - 属性或请求与字段之间的关系,例如属性 3 获得了街道照明,或者像请求 nr 4 中客户请求的带有街道照明的属性)任务:创建一个查询构建器,返回所有匹配的属性应要求。


首先,我加入了(在 PropertiesRepository 中)每个属性的 FieldValues:

$qb->innerJoin(FieldValues::class,"fieldsValues", 'WITH', 'fieldsValues.property = p.id');

然后,对于请求的每个 FieldValue,我尝试:

// $fieldValReq is the fieldValue of the request from the current iteration 
// fieldsValues.field represent FieldValue's Field Id
$qb
    ->andWhere($qb->expr()->eq("fieldsValues.field", ':valueF'))
    ->setParameter('valueF', $fieldValReq->getField()->getId())

$qb
   ->andWhere($qb->expr()->eq("fieldsValues.value", ':valueV'))
   ->setParameter('valueV', $fieldValReq->getValue())

遍历请求 fieldValues 的所有事情都在 foreach 内部发生


问题是,在第一次迭代之后,例如(第二次迭代),查询生成器结果下降到 0,因为在第一次迭代中执行的这段代码已经与 fieldValue 的 id(例如街道照明)匹配,现在尝试通过当前 fieldValue 的 id(例如 PVC Windows)再次匹配找到的结果,这无法完成,因为一个 id 不能匹配 2 个不同的东西。

$qb
    ->andWhere($qb->expr()->eq("fieldsValues.field", ':valueF'))
    ->setParameter('valueF', $fieldValReq->getField()->getId())

我唯一的解决方案是为每个 fieldValue 获取不同的结果集,并制作一个 php 函数,使所有结果集相交,但是当数据库记录数变大时,这会变得一团糟。我需要一个查询生成器来查找与确切请求字段匹配的属性。

所有图片都是表格字段值表

标签: phpmysqldoctrine-ormsymfony4query-builder

解决方案


您需要动态参数名称!

    $valueFName = sprintf('valueF%d', $fieldValReq->getField()->getId());
    $valueVName = sprintf('valueV%d', $fieldValReq->getField()->getId());
    $qb
        ->andWhere($qb->expr()->eq("fieldsValues.field", ':'.$valueFName))
        ->setParameter($valueFName, $fieldValReq->getField()->getId());

    $qb
       ->andWhere($qb->expr()->eq("fieldsValues.value", ':'.$valueVName))
       ->setParameter($valueVName, $fieldValReq->getValue());

推荐阅读