根据条件在查询中设置参数

Set parameters in the query based on the condition

我需要编写一个包含多个 where 条件和 OR 条件的查询。这个OR条件只有当$location数组不为空时才会出现。所以只有当这个数组不为空时才需要参数。

我不知道在这个条件下这个参数条件怎么写。

这是我正在处理的查询。

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