В Doctrine 2.3 добавлен метод match () , который позволяет использовать Критерии .
Пример Джереми Хикса может быть написан так (обратите внимание, что вместо массива возвращается ArrayCollection).
public function findActiveFestivals($start, $end)
{
$expr = Criteria::expr();
$criteria = Criteria::create();
$criteria->where($expr->gte('start', $start));
$criteria->andWhere($expr->lte('end', $end);
return $this->matching($criteria);
}
Лично я бы не стал использовать и где-то здесь, а использоватьеще несколько строк для улучшения читабельности, например:
public function findActiveFestivals($start, $end)
{
$expr = Criteria::expr();
$criteria = Criteria::create();
$criteria->where(
$expr->andX(
$expr->gte('start', $start),
$expr->lte('end', $end)
)
);
return $this->matching($criteria);
}
Использовать предложение IN очень просто.
public function findFestivalsByIds($ids)
{
$expr = Criteria::expr();
$criteria = Criteria::create();
$criteria->where($expr->in('id', $ids));
return $this->matching($criteria);
}
Класс Criteria находится в Doctrine, который не совсем ORM-илиПространство имен DBAL Common, как и их ArrayCollection (который поддерживает критерии больше, чем EntityRepository).
Это означает, что код без репозитория не может быть использован для создания сфокусированных критериев.Так что должно быть хорошо использовать этот класс за пределами хранилища.QueryBuilder в последнее время также поддерживает критерии .Таким образом, даже при создании более сложных запросов, требующих QueryBuilder, вы можете использовать Criteria для обеспечения гибкости кода, не относящегося к базе данных, в том, что он запрашивает.