【发布时间】: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