我正在使用Doctrine QueryBuilder创建一个查询,以通过电子邮件结尾选择一堆用户。我有一系列的电子邮件结尾,例如['@someservice.com', '@anotherservice.com' ]
。
我知道我可以通过WHERE IN
选择数组中的字符串:
$qb= $this
->createQueryBuilder('u')
->orderBy('u.id', 'asc')
->where('u.email IN (:emails)')
->setParameter('emails', [
'@someservice.com',
'@anotherservice.com'
]);
然而,对于字符串的确切出现以及查询的查询当然会返回一个空的结果集。
这就是为什么我想在数组上进行LIKE搜索,但却采取以下措施:
$qb= $this
->createQueryBuilder('u')
->orderBy('u.id', 'asc')
->where('u.email LIKE IN (:emails)')
->setParameter('emails', [
'%@someservice.com',
'%@anotherservice.com'
]);
不幸失败了。是否有一些语法糖用于执行这样的查询,或者我是否必须通过一堆orHaving
调用进行查询?
答案 0 :(得分:2)
我做了类似的事情:
foreach($emailEndings as $index => $ending) {
$qb->orWhere("u.email LIKE :email$index");
$qb->setParameter("email$index", $ending);
}
索引很重要,否则只选择数组的最后一个条目。
请注意,如果您有多个where子句,则会因orWhere
子句而遇到麻烦。您无法将其更改为andWhere
,因为这会导致结果集为空。在该用例中,您需要将Orx
中的条件分组为andWhere
,如下所示:
/**
* @param QueryBuilder $qb
*/
protected function addInternalFilter(QueryBuilder $qb)
{
$conditions = [];
foreach ($this->emailEndings as $index => $ending) {
$conditions[] = "u.email LIKE :string$index";
$qb->setParameter("string$index", $ending);
}
if (empty($conditions)) {
throw new \LogicException('Conditions are empty.');
}
$qb->andWhere(new Orx($conditions));
}
答案 1 :(得分:0)
你不能那样做。 %是LIKE,LIKE不用于IN。
您只能使用OR来处理它:
->where("u.email LIKE '%@someservice.com' OR u.email LIKE '%@anotherservice.com'")