在Find By Doctrine中查找OR运算符

时间:2015-05-20 06:12:05

标签: doctrine-orm

我想在doctrine中使用OR运算符,并且不想使用查询构建器。

return $this->repository->findBy(
        array('status' => 1, 'flag' =>1, 'contentType' => 'news'),
        array('created' => 'DESC'),
        $limit
    );

我希望这个查询像staus 1或者标志1一样运行但是它的运行方式与AND运算符相同。

谢谢!

2 个答案:

答案 0 :(得分:0)

我知道这可能对你没什么帮助,因为你不想诉诸QueryBuilder,但是如果你改变你的话,我会发布它请注意,因为我还没有找到将这种条件添加到findBy的方法。

由于EntityRepository实施Doctrine\Common\Collections\Selectable,您可以添加Criteria以进一步过滤/查找结果。关于API的一个很酷的事情是它支持repositorycollectionslazy 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()操作。您有两种选择:

  1. 扩展您的$this->repository以包含您自己的自定义findBy方法,该方法将支持您OR操作。更多详情here

  2. 使用QueryBuilder / DQL / raw SQL直接运行您的查询。

  3. 不幸的是,这两种方法都包括编写某种查询语言。我个人觉得QueryBuilder有点乱,特别是对于更复杂的查询,所以如果你是新手,我建议从普通DQL开始!