Метод notIn
Метод notIn класса Expr создаёт условие
NOT IN для SQL-запроса. Он используется
в QueryBuilder для фильтрации записей: результатом
выборки станут только те строки, значение указанного поля
которых не входит в переданный массив значений.
В отличие от метода in, который оставляет совпадения,
notIn исключает их из результата.
Первым параметром передаётся имя поля, вторым - массив
значений для исключения.
Синтаксис
$expr->notIn(string $field, array $values)
Пример
Давайте выберем статьи, идентификатор которых не входит
в список [1, 2, 3]:
<?php
namespace AppRepository;
use AppEntityArticle;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findExcluded(): array
{
$qb = $this->createQueryBuilder('a');
$qb->where(
$qb->expr()->notIn('a.id', [1, 2, 3])
);
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения метода:
["article 4", "article 5"]
Пример
Давайте исключим статьи с определёнными статусами, используя строковые значения:
<?php
namespace AppRepository;
use AppEntityArticle;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findByStatus(): array
{
$qb = $this->createQueryBuilder('a');
$qb->where(
$qb->expr()->notIn('a.status', ['draft', 'archived'])
);
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения метода:
["article 1", "article 2"]
Пример
Давайте скомбинируем notIn с другими условиями
через метод andX:
<?php
namespace AppRepository;
use AppEntityArticle;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;
class ArticleRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Article::class);
}
public function findFiltered(): array
{
$qb = $this->createQueryBuilder('a');
$qb->where(
$qb->expr()->andX(
$qb->expr()->notIn('a.id', [1, 2, 3]),
$qb->expr()->eq('a.status', ':status')
)
);
$qb->setParameter('status', 'published');
return $qb->getQuery()->getResult();
}
}
?>
Результат выполнения метода:
["article 4"]