动态查询中的查询生成器 "OR"

Query Builder "OR" in dynamic query

我想使用子句 "OR" 构建一个查询,该查询接收一个数组参数,但不知道它包含的元素。

查询必须 return 类别为“1”或“2”的内容列表(如果 $categ 数组包含 [1,2])等。 类别是内容实体中的外键。

我的存储库:

   public function getContentOfSomeCategories($categs)
    {
        $query = $this->createQueryBuilder('c');

        $conditions = [];
        foreach($categs as $value){
            $conditions[] = 'c.contentCategory = '.$value;
        }

        $orX = $query->expr()->orX();
        foreach ($conditions as $condition) {
            $orX->add($condition);
        }
        $query->add('where', $orX);

我收到错误消息 "Too many parameters: the query defines 1 parameters and you bound 2"。

从 PHP 5.6 开始,您可能可以使用 PHP splat ... 将数组扩展为参数。

        $query = $this->createQueryBuilder('c');
        $expr = $query->expr();

        $conditions = [];
        $valueNo = 0;
        foreach ($categs as $value) {
            $conditions[] = $expr->eq('c.contentCategory', 'value'.$valueNo);
            $query->setParameter('value'.$valueNo, $value);
            $valueNo++;
        }
        $query->andWhere($expr->orX(...$conditions));

免责声明:我没有测试过这个。

参见:https://www.php.net/manual/en/functions.arguments.php

You can also use ... when calling functions to unpack an array or Traversable variable or literal into the argument list:

编辑:

如果您的查询很简单,您可以直接使用 orWhere

        $query = $this->createQueryBuilder('c');
        $expr = $query->expr();

        $valueNo = 0;
        foreach ($categs as $value) {
            $query->orWhere($expr->eq('c.contentCategory', 'value'.$valueNo));
            $query->setParameter('value'.$valueNo, $value);
            $valueNo++;
        }

编辑 2:

您甚至可能只想使用 in 子句。

$query->where($expr->in('c.contentCategory', ':values'));
$query->setParameter('values', $categs);`

您可以很容易地实现这一点,下面使用查询构建器表达式构建器:

$queryBuilder = $this->createQueryBuilder('c');

$conditions = [];

$i = 0;

foreach ($categs as $value) {
    $i++;

    $conditions[] = $queryBuilder->expr()->eq('c.contentCategory', $i);
    $queryBuilder->setParameter($i, $value);
}

$queryBuilder->andWhere(
    $queryBuilder->expr()->orX()->addMultiple($conditions)
);

如果您的参数适用于所有参数,那么您只需添加

$queryBuilder->setParameter();