Doctrine QueryBuilder 忽略的参数

Parameters being ignored with Doctrine QueryBuilder

我有一堆包含参数的过滤器,我希望使用 Doctrine 中的 QueryBuilder 将这些参数包含在我的查询中。

这是我的代码:

$qb=  $em->createQueryBuilder();
$query_qb = $qb
     ->from('padmaxResilieBundle:Subscriber','s')
     ->leftjoin('s.terminationPaper','l')
     // ...
     ->leftjoin('c.cancelreasons','cr');

    if ($filters) {
        foreach ($filters as $value) {
            $query_qb->andWhere($value);
        }
    }

    $query_qb->setParameters($this->paramsMap);

     $total = $query_qb->addSelect('COUNT(DISTINCT s)')
         ->getQuery()
         ->getResult();

数组 $filters 的每个元素都是包含 1 次或多次出现的参数的字符串,例如:

$filters = array(
    0 => "s.lastname LIKE '%:param1%' OR s.firstname LIKE '%:param1%'"
    1 => "c.contractNumber LIKE '%:param2%'"
    // ...
)

每个过滤器的参数标识符都不同,并且在属性 paramMap 中被引用,例如:

$this->paramMap = array(
    "param1" => "my_value",
    "param2" => "hello",
    // ...
)

我确信过滤器数组和 paramMap 都是正确的并且相互引用但我总是得到错误:

Invalid parameter number: number of bound variables does not match number of tokens

我不知道我做错了什么,有什么想法吗?

您不能像现在这样在字符串中使用参数:

"c.contractNumber LIKE '%:param2%'"

您需要在参数中加入 % 字符:

$filters = array(
    0 => "s.lastname LIKE :param1 OR s.firstname LIKE :param1"
    1 => "c.contractNumber LIKE :param2"
    // ...
)

$this->paramMap = array(
    "param1" => "%my_value%",
    "param2" => "%hello%",
    // ...
)