Метод isMemberOf класса Expr
Метод isMemberOf класса Expr создаёт выражение для проверки того, что значение поля входит в заданный набор значений или результатов подзапроса. Первым параметром передаётся имя поля или выражение, вторым - коллекция значений или объект QueryBuilder. Метод часто используется в Doctrine QueryBuilder для фильтрации данных по списку идентификаторов.
Синтаксис
public function isMemberOf(mixed $value, mixed $collection): Comparison
Пример
Давайте создадим QueryBuilder и проверим, входит ли идентификатор пользователя в массив [1, 2, 3]:
<?php
namespace AppRepository;
use AppEntityUser;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrineORMEntityManagerInterface;
use DoctrineORMQueryExpr;
class UserRepository extends ServiceEntityRepository
{
public function __construct(EntityManagerInterface $em)
{
parent::__construct($em, User::class);
}
public function findUsersInGroup(): array
{
$qb = $this->createQueryBuilder('u');
$expr = new Expr();
$qb->where($expr->isMemberOf('u.id', [1, 2, 3]));
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения кода:
["user 1", "user 2", "user 3"]
Пример
Давайте используем подзапрос для проверки вхождения:
<?php
namespace AppRepository;
use AppEntityArticle;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrineORMEntityManagerInterface;
use DoctrineORMQueryExpr;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(EntityManagerInterface $em)
{
parent::__construct($em, Article::class);
}
public function findArticlesByUserIds(): array
{
$qb = $this->createQueryBuilder('a');
$expr = new Expr();
$sub = $this->createQueryBuilder('u')
->select('u.id')
->where('u.active = :active')
->setParameter('active', true);
$qb->where($expr->isMemberOf('a.userId', $sub->getDQL()));
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения кода:
["article 1", "article 2"]