Doctrine 2.3 添加了一个 match() 方法,允许您使用条件。
Jeremy Hicks的例子可以这样写(注意,这返回的是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);
}
就个人而言,我不会在这里使用和where,而是使用更多的行来提高可读性,如下所示:
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 的 not-real-ORM-or-DBAL Common 的命名空间中,就像它们的 ArrayCollection(它支持 Criteria 的时间比 EntityRepository 长)。
它旨在成为非存储库代码创建拟合标准的一种解耦方式。因此,在存储库外部使用此类应该没问题。QueryBuilder最近也支持Criteriment。因此,即使在构建需要QueryBuilder的更复杂的查询时,您也可以使用条件为非数据库代码提供请求的灵活性。