Я использую 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
звонки?
Я достиг чего-то похожего, сделав:
foreach($emailEndings as $index => $ending) {
$qb->orWhere("u.email LIKE :email$index");
$qb->setParameter("email$index", $ending);
}
Индекс важен, так как в противном случае выбирается только последняя запись массива.
Имейте в виду, что если у вас есть несколько пунктов, где у вас возникнут проблемы из-за 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));
}
Вы не может сделай это. % для LIKE, LIKE не используется с IN.
Вы можете справиться с этим только с помощью ИЛИ:
->where("u.email LIKE '%@someservice.com' OR u.email LIKE '%@anotherservice.com'")