我在symfony4中有一个遗产Web应用程序,并且具有db sql结构:表(请求-任何客户端都可以请求购买属性,属性-实际建筑物,字段-用于自定义表格的动态字段类型,例如ElectricCurrent ,TV,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函数,但是当数据库记录数变多时,这是一团糟。我需要一个查询生成器来查找与确切请求字段匹配的属性。
所有图片均为表格字段值表
答案 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());