如何使查询构建器根据请求

时间:2019-08-23 10:38:57

标签: php mysql doctrine-orm symfony4 query-builder

我在symfony4中有一个遗产Web应用程序,并且具有db sql结构:表(请求-任何客户端都可以请求购买属性,属性-实际建筑物,字段-用于自定义表格的动态字段类型,例如ElectricCurrent ,TV,AC和FieldValues-属性或请求与字段之间的关系,例如属性3获得路灯照明,或类似于请求nr 4中客户请求的具有路灯的属性) 任务:创建一个查询构建器,以返回根据请求匹配的所有属性。


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

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

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

  • 1。)检查属性是否具有这种FieldValue,因为当客户添加他的属性时,他可以添加特定的fieldValues,也可以不添加

// $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())
  • 2。)检查找到的属性中的FieldValue的值是否为请求的FieldValue

$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函数,但是当数据库记录数变多时,这是一团糟。我需要一个查询生成器来查找与确切请求字段匹配的属性。

所有图片均为表格字段值表

  • 1。)寻找请求ID 1022的fieldValues enter image description here
  • 2。)寻找与请求编号为1022的字段相匹配的属性 enter image description here

1 个答案:

答案 0 :(得分:0)

您需要动态参数名称!

    $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());