我正在尝试根据连接中的多个ID进行选择,每个ID应该与另一个连接的另一个条件匹配。
我需要在“位置”1或2中获得具有所有“二分法”的“类型”。此时它给出的结果与传递给函数的一个二分法相匹配,但不是全部。
$QB->select("Types","Types,ElementsPositions, Elements, Positions, Dichotomies, Quadras,TypesDescriptions,Relations")
->from($this->get_repository()[0], 'Types');
$QB->leftJoin("Types.ElementsPositions","ElementsPositions", \Doctrine\ORM\Query\Expr\Join::WITH, 'ElementsPositions.Positions = 1 OR ElementsPositions.Positions = 2');
$QB->leftJoin("ElementsPositions.Elements","Elements");
$QB->leftJoin("ElementsPositions.Positions","Positions");
$QB->leftJoin("Elements.Dichotomies","Dichotomies");
$QB->leftJoin("Types.Quadras","Quadras");
$QB->leftJoin("Types.TypesDescriptions","TypesDescriptions");
$QB->leftJoin("Types.Relations","Relations");
if(!empty($where['dichotomies'])){
foreach($where['dichotomies'] as $dichotomy){
$QB->andWhere('Dichotomies.id'.'=:dichotomy');
$QB->setParameter('dichotomy', $dichotomy['id']);
}
}
UPD。 表映射 - 在JSON中:
{
"table-name": "types",
"joins":[
{
"table-name":"elements_positions",
"type":"one-to-many"
},
{
"table-name":"quadras",
"type":"many-to-one"
},
{
"table-name":"types_descriptions",
"type":"one-to-one"
},
{
"table-name":"relations",
"type":"many-to-one"
}
]}
元素位置
{
"table-name": "elements_positions",
"joins":[
{
"table-name":"elements",
"type":"many-to-one"
},
{
"table-name":"positions",
"type":"many-to-one"
},
{
"table-name":"types",
"type":"many-to-one"
}
]
}
元素
{
"table-name": "elements",
"joins":[
{
"table-name":"elements_positions",
"type":"one-to-many"
},
{
"table-name":"quadras",
"type":"many-to-many"
},
{
"table-name":"dichotomies",
"type":"many-to-many"
}
]
}
位置
"table-name": "positions",
"joins":[
{
"table-name":"elements_positions",
"type":"one-to-many"
}
]
}
两分法:
{
"table-name": "dichotomies",
"joins":[
{
"table-name":"elements",
"type":"many-to-many-inversed"
}
]
}
答案 0 :(得分:1)
您的查询有两个不同的问题。
首先,多个参数值与单个参数绑定。 $where['dichotomies']
的每个下一个元素都会替换查询中参数:dichotomy
的先前值。方法setParameters()并不真正将值绑定到预准备语句:它只是将它们存储在QueryBuilder对象中。因此,在foreach-loop结束后,所有条件都将使用相同的值($where['dichotomies']
的最后一个)。为避免这种情况,您需要使用不同的参数名称或数字索引。
其次,你添加了矛盾的条件:$QB->andWhere()
会产生类似的东西:
Dichotomies.id = :dichotomy
AND Dichotomies.id = :dichotomy
AND Dichotomies.id = :dichotomy
...
一个实体ID显然不能同时等于不同的值。因此,您需要使用AND
运算符替换OR
。
但更好的方法是使用IN
子句:
调用
setParameter()
会自动推断您将哪种类型设置为值。这适用于整数,字符串/整数数组,DateTime实例和托管实体。
只需用以下几行替换foreach-loop:
$QB->andWhere('Dichotomies.id IN (:dichotomies)');
$QB->setParameters('dichotomies', array_column($where['dichotomies'], 'id'));
array_column()
函数返回所有二分法的ID列表。 Doctrine生成IN
表达式并使用该列表生成查询占位符并绑定值。