Задать параметры в запросе на основе условия - PullRequest
1 голос
/ 24 января 2020

Мне нужно написать запрос с несколькими условиями 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"],
        ));

Ответы [ 2 ]

3 голосов
/ 24 января 2020

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"]);
}
0 голосов
/ 24 января 2020

Вы можете создать массив параметров, который содержит условные параметры.

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