Метод like класса Expr
Метод like класса Expr создаёт условие для сравнения поля с заданным шаблоном. Первым параметром передаётся имя поля или выражение, вторым - шаблон для сравнения. Метод возвращает объект Comparison, который можно использовать в методах where, andWhere и orWhere построителя запросов Doctrine.
Шаблон может содержать специальные символы подстановки: % соответствует любому количеству символов, а _ - ровно одному символу. Сравнение выполняется с учётом регистра в большинстве СУБД.
Синтаксис
$expr->like(field, pattern)
Пример
Давайте найдём статьи, название которых начинается с 'abcde':
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
class ArticleRepository extends EntityRepository
{
public function findByTitlePrefix(string $prefix): array
{
$qb = $this->createQueryBuilder('a');
$expr = $qb->expr();
$qb->where($expr->like('a.title', ':prefix'))
->setParameter('prefix', $prefix . '%');
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения кода для вызова findByTitlePrefix('abcde'):
["abcde article", "abcde news"]
Пример
Давайте найдём пользователей, email которых содержит 'user':
<?php
namespace App\Repository;
use App\Entity\User;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
class UserRepository extends EntityRepository
{
public function findByEmailPart(string $part): array
{
$qb = $this->createQueryBuilder('u');
$expr = $qb->expr();
$qb->where($expr->like('u.email', ':part'))
->setParameter('part', '%' . $part . '%');
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения кода для вызова findByEmailPart('user'):
["user@example.com", "myuser@mail.com"]
Пример
Давайте используем like вместе с orX для поиска по двум полям:
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
class ArticleRepository extends EntityRepository
{
public function search(string $term): array
{
$qb = $this->createQueryBuilder('a');
$expr = $qb->expr();
$qb->where(
$expr->orX(
$expr->like('a.title', ':term'),
$expr->like('a.text', ':term')
)
)->setParameter('term', '%' . $term . '%');
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения кода для вызова search('article'):
["article 1", "article 2", "new article"]