【问题标题】:Doctrine query builder parenthesis bad place教义查询生成器括号不好的地方
【发布时间】:2019-10-15 16:42:16
【问题描述】:

我有一个查询,它接收一些数组参数,但不知道行是如何存在的。它必须返回包含所有过滤器(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;
}

【问题讨论】:

  • 获取多个类别的调用需要一个andWhere() 包裹它...或者,使用IN() 列表并加入您的类别ID。那么你就不需要代码中的分组语句或fork了。
  • 感谢您的帮助! =) 如果我用 andWhere 更改我的类别或 Where 我得到零结果,因为内容不能有多个类别。我尝试使用“IN”并做了: $query->andWhere($expr->in('c.contentCategorycontentCategory', array('?mycategs'))); $query->setParameter('mycategs', array_values($categsTab));但我得到了太多参数:查询定义了 5 个参数,而你绑定了 6"。

标签: symfony doctrine-orm doctrine-query


【解决方案1】:

你把 orWhere's 放在 1 和Where 里面是这样的:

$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);

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多