在 Doctrine 语句中添加有从句

Posted

技术标签:

【中文标题】在 Doctrine 语句中添加有从句【英文标题】:Adding a Having Clause to Doctrine Statement 【发布时间】:2013-08-26 14:31:51 【问题描述】:

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

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

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

【问题讨论】:

试一试:$qb->having('count(*) = 3');注意 = 周围的空格。曾经有一个错误。似乎它现在会被修复,但也许不会。 我仍然得到同样的错误,我也没有找到任何关于这个错误的信息。我什至找不到这样使用它的例子。 就像我说的,这是一个老错误。真的没想到它会起作用。发布的查询对我来说有点太复杂了。我建议使用 HAVING 子句制作一个简单的 DQL,然后检查生成的 sql 并验证查询是否有效。然后开始添加东西。一个简单的单行问题会更容易回答。 感谢 Cerad,感谢您的帮助。我会试试看,然后告诉你结果如何。 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

这是我尝试的第一种方法,然后再次尝试,仍然没有运气,我得到了同样的错误【参考方案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(捆绑实体)的别名。

【讨论】:

以上是关于在 Doctrine 语句中添加有从句的主要内容,如果未能解决你的问题,请参考以下文章

db2中sql语句的where从句 不等于怎么写

避免使用Doctrine DBAL查询构建器select语句将驼峰别名名称转换为小写

DQL 语句在使用 Zend Framework 和 Doctrine 的应用程序中的位置

通过比较语句对 Doctrine 中的结果进行排序

三元从句中连续两个问号是啥意思?

PHP Doctrine 1.2 SET 语句中的条件 IF 语句