我是Doctrine的新手,我正在试图弄清楚如何在我的陈述中添加一个having子句。基本上我希望能够根据用户选择的属性过滤掉返回的项目。代码如下:
// create query builder
$qb = $this->getEntityManager()->createQueryBuilder();
$qb->select('p')
->from($this->_entityName, 'p')
->leftJoin('p.options', 'o')
->where('p.active = :active')
->setParameter('active', 1);
// add filters
$qb->leftJoin('o.attributes', 'a');
$ands = array();
foreach ($value as $id => $values)
{ echo count($values);
$ands[] = $qb->expr()->andX(
$qb->expr()->eq('a.attribute_id', intval($id)),
$qb->expr()->in('a.attribute_value_id', array_map('intval', $values))
$qb->having('COUNT(*)=3) // THIS DOESN'T WORK
//$qb->expr()->having('COUNT(*)=3) // THIS DOESN'T WORK EITHER
);
}
$where = $qb->expr()->andX();
foreach ($ands as $and)
{
$where->add($and);
}
$qb->andWhere($where);
$result = $qb->getQuery()->getResult();
return $result;
当我尝试使用having()子句执行语句时,我收到此错误: 在此上下文中不允许表达“Doctrine \ ORM \ QueryBuilder”类型。
没有having()子句,一切都很完美。
我不知道如何解决这个问题。
答案 0 :(得分:12)
HAVING子句需要GROUP BY。在学说中它会是这样的:
$qb->groupBy('p.id'); // or use an appropriate field
$qb->having('COUNT(*) = :some_count');
$qb->setParameter('some_count', 3);
假设你正在使用mysql,这里有一个having子句教程:http://www.mysqltutorial.org/mysql-having.aspx
答案 1 :(得分:1)
也许您应该将数字3绑定到参数:
$qb->having('COUNT(*)=:some_count')
$qb->setParameter('some_count',3)
答案 2 :(得分:1)
目标:过滤我们想要在O2M关系的许多方面过滤我们想要过滤的一些已知可用条件的一侧(例如,捆绑中的原始部件的数量),我们希望限制一侧还有一些其他标准可供选择。
然后我们在LEFT_JOIN操作的几个条件中添加: 条件#1 - bundle.id == original_part.bundle ID。 条件#2 - original_part的partStatusType == 3(一些硬编码值)。
然后我们过滤到COUNT(op)> = 1,这给出了我们更有限的响应,它可以很好地与分页一起使用。
$qb->leftJoin(OriginalPart::class, 'op', Expr\Join::WITH,
$qb->expr()->andX(
$qb->expr()->eq('op.bundle', 'row.id'),
$qb->expr()->eq('op.partStatusType', 3)));
$qb->groupBy('row.id');
$qb->having($qb->expr()->gte('COUNT(op)', 1));
row是One(包实体)的别名。