我想在doctrine中使用OR运算符,并且不想使用查询构建器。
return $this->repository->findBy(
array('status' => 1, 'flag' =>1, 'contentType' => 'news'),
array('created' => 'DESC'),
$limit
);
我希望这个查询像staus 1或者标志1一样运行但是它的运行方式与AND运算符相同。
谢谢!
答案 0 :(得分:0)
我知道这可能对你没什么帮助,因为你不想诉诸QueryBuilder
,但是如果你改变你的话,我会发布它请注意,因为我还没有找到将这种条件添加到findBy
的方法。
由于EntityRepository
实施Doctrine\Common\Collections\Selectable
,您可以添加Criteria
以进一步过滤/查找结果。关于API的一个很酷的事情是它支持repository
,collections
和lazy collections
。
只需在存储库文件的顶部添加use Doctrine\Common\Collections\Criteria;
,我们就可以定义一个单独的方法,以便更清晰地定义我们的标准,如下所示:
public function addStatusOrFlagCriteria() {
$expr = Criteria::expr();
$criteria = new Criteria();
$criteria
->where(
$expr->orX(
$criteria->expr()->eq('flag', 1),
$criteria->expr()->eq('flag', 0)
)
)
->orderBy(array('id' => 'ASC'))
;
return $criteria;
}
然后,根据您调用存储库方法的方式来判断,使用此条件将是:
$result = $this->repository->matching(
$this->repository->addStatusOrFlagCriteria()
);
哪会返回Doctrine\ORM\LazyCriteriaCollection
答案 1 :(得分:0)
默认情况下,Doctrine不支持OR
方法中的findBy()
操作。您有两种选择:
扩展您的$this->repository
以包含您自己的自定义findBy
方法,该方法将支持您OR
操作。更多详情here
使用QueryBuilder
/ DQL
/ raw SQL
直接运行您的查询。
不幸的是,这两种方法都包括编写某种查询语言。我个人觉得QueryBuilder
有点乱,特别是对于更复杂的查询,所以如果你是新手,我建议从普通DQL
开始!