我需要编写一个具有多个where
条件和OR
条件的查询。仅当数组不为空时$location
此OR
条件。因此,仅当此数组不为空时才需要参数。
我不确定在这种情况下如何编写此参数条件。
这是我正在处理的查询。
$qb = $this->createQueryBuilder("e")
->select(
"e.vehicleId",
"e.schemaId",
"e.location",
)
->andWhere("e.vehicleId = :vehicleId")
->andWhere("e.optionId = :optionId")
->andWhere("e.schemaId = :schemaId");
if (count($position) > 0) {
$qb->andWhere($qb->expr()->orX(
$qb->expr()->andX("e.location = :location"),
$qb->expr()->andX("e.location = :loc")
));
}
$qb->setParameters(array(
"vehicleId" => $vehicleId,
"schemaId" => $schemaId,
"location" => $position["location"],
"loc" => $position["loc"],
));
QueryBuilder
有两种方法来设置查询参数。
您正在使用的那个(setParameters(array $parameters)
,以及更简单的setParameter($parameterName, $parameterValue)
。
使用后者而不是您正在使用的参数,您可以在需要的地方设置参数:
if (count($position) > 0) {
$qb->andWhere($qb->expr()->orX(
$qb->expr()->andX("e.location = :location"),
$qb->expr()->andX("e.location = :loc")
))
->setParameter('location', $position["location"])
->setParameter('loc', $position["loc"]);
}
您可以创建包含条件参数的参数化 parameteR 数组。
if (count($position) > 0) {
$qb->andWhere($qb->expr()->orX(
$qb->expr()->andX("e.location = :location"),
$qb->expr()->andX("e.location = :loc")
));
$parameter["location"] = $position["location"];
$parameter["loc"] = $position["loc"];
}
然后将此参数数组传递并合并到 setParameters 方法中。
$qb->setParameters(array_merge(
array(
"vehicleId" => $vehicleId,
"schemaId" => $schemaId,
),
$parameters
));