Doctrine查询生成器括号坏处

问题描述 投票:0回答:1

我有一个查询,该查询接收一些数组参数,但不知道行数如何。它必须返回包含所有过滤器(AND子句)和一个或多个类别(OR子句)的内容。

我无法获得想要的结果,因为括号不是一个好地方。我应该得到这个SQL渲染:

WHERE (
  f3_.idfilter = '87'
  AND f5_.idfilter = '90'
  AND f7_.idfilter = '154'
  AND f9_.idfilter = '165'
)
AND (
  c0_.content_category_idcontent_category = 1
  OR c0_.content_category_idcontent_category = 3
)

并得到这个代替:

WHERE (
  (
    f3_.idfilter = '87' 
    AND f5_.idfilter = '90' 
    AND f7_.idfilter = '154' 
    AND f9_.idfilter = '165' 
    AND c0_.content_category_idcontent_category = 1
  ) 
  OR c0_.content_category_idcontent_category = 3
) 

我的代码:

public function getContentByFiltersAjax($categs, $filters, $offset, $limit) {
    $filtersTab = explode(',', $filters);
    $query = $this->createQueryBuilder('c');

    for ($i = 1; $i <= count($filtersTab); $i++) {
        $query = $query
            ->leftJoin('c.filterfilter', 'f' . $i)
            ->andWhere('f' . $i . '.idfilter = :filter_idfilter' . $i)
            ->setParameter('filter_idfilter' . $i, $filtersTab[$i - 1]);
    }

    $categsTab = explode(',', $categs);

    if(sizeof($categsTab) > 1) {
        $expr = $query->expr();
        $categsTab = explode(',', $categs);

        foreach ($categsTab as $key => $value) {
            if($key === 0){
                $query->andWhere($expr->eq('c.contentCategorycontentCategory', $value));
            } else {
                $query->orWhere($expr->eq('c.contentCategorycontentCategory', $value));
            }
        }
    } else {
        $query
            ->andWhere('c.contentCategorycontentCategory = :category')
            ->setParameter('category', $categs);
    }

    $query
        ->andWhere('c.status = :status')
        ->setParameter('status', 'publie');

    $query->orderBy('editor.plan', 'DESC');
    $query->addOrderBy('c.creationDate', 'DESC');

    $query
        ->setFirstResult($offset)
        ->setMaxResults($limit);

    $result = $query->distinct()->getQuery()->getResult();

    return $result;
}
symfony doctrine-orm doctrine-query
1个回答
0
投票

您将orWhere位于1和其中,如下所示:

$query->andWhere(
    $query->expr->orX(
        $query->expr->eq('c.contentCategorycontentCategory', $value1),
        $query->expr->eq('c.contentCategorycontentCategory', $value2)
    )
);

或在您的foreach循环中:

$orX = $query->expr->orX();

foreach ($categsTab as $value) {
    $orX->add($query->expr->eq('c.contentCategorycontentCategory', $value));
}

$query->andWhere($orX);
© www.soinside.com 2019 - 2024. All rights reserved.