动态查询中的查询生成器 "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();
我想使用子句 "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();