在原则声明中增加一个有条款


Adding a Having Clause to Doctrine Statement

我是Doctrine的新手,我正试图弄清楚如何在我的语句中添加一个have子句。基本上,我希望能够根据用户选择的属性数量来筛选返回的项目。代码如下:

// 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()子句,一切都可以完美运行。

我不知道如何解决这个问题。

HAVING子句需要GROUP BY。在原则中,它应该是这样的:

$qb->groupBy('p.id'); // or use an appropriate field
$qb->having('COUNT(*) = :some_count');
$qb->setParameter('some_count', 3);

假设您使用的是mysql,这里有一个have子句教程:http://www.mysqltutorial.org/mysql-having.aspx

也许您应该将数字3绑定到一个参数:

$qb->having('COUNT(*)=:some_count')
$qb->setParameter('some_count',3)

目标:筛选在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(bundle实体)的别名。