Доктрина построитель запросов скобки плохое место - PullRequest
0 голосов
/ 15 октября 2019

У меня есть запрос, который получает некоторые параметры массива без каких-либо представлений о наличии строк. Он должен возвращать содержимое со всеми фильтрами (предложение 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;
}

1 Ответ

3 голосов
/ 15 октября 2019

Вы помещаете orWhere внутри 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);
...