Метод exists класса Expr
Метод exists класса Expr создаёт SQL-выражение EXISTS,
которое проверяет, возвращает ли подзапрос хотя бы одну строку.
Метод принимает один параметр - подзапрос QueryBuilder
или строку с DQL-запросом.
Синтаксис
$expr->exists($subquery)
Пример
Давайте выберем статьи, у которых есть хотя бы один комментарий:
<?php
namespace App\Repository;
use App\Entity\Article;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr;
use Doctrine\Persistence\ManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findWithComments(): array
{
$expr = new Expr();
$sub = $this->createQueryBuilder('c')
->select('1')
->where('c.article = a.id');
$qb = $this->createQueryBuilder('a');
$qb->where($expr->exists($sub->getDQL()));
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения кода:
["article 1", "article 2", "article 3"]
Пример
Давайте проверим наличие пользователя с определённым именем через подзапрос:
<?php
namespace App\Repository;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr;
use Doctrine\Persistence\ManagerRegistry;
class UserRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, User::class);
}
public function hasUserNamed(string $name): bool
{
$expr = new Expr();
$sub = $this->createQueryBuilder('u')
->select('1')
->where('u.name = :name')
->setParameter('name', $name);
$qb = $this->createQueryBuilder('x');
$qb->select('1')
->where($expr->exists($sub->getDQL()))
->setParameter('name', $name);
return (bool) $qb->getQuery()->getOneOrNullResult();
}
}
?>
Результат выполнения кода для имени 'abcde':
true