0

我正在学习 symfony2 和教义 2。我的查询中有错误,我无法找到解决方案。我想知道如何使用 queryBuilder 比较聚合列。

$repository = $this->getDoctrine()
            ->getRepository('SviplAdminBundle:CouponHolder');

            $qb = $repository->createQueryBuilder('ch');
            $qb = $qb->select(array('ch.id'))
            ->addSelect($qb->expr()->concat(
                $qb->expr()->concat(
                                'ch.full_name', 
                                $qb->expr()->concat(
                                    $qb->expr()->literal(' ('), 
                                    'ch.refer_owner_code'
                                    )
                                ), 
                                $qb->expr()->literal(')')
                                ).' AS HIDDEN name'
                            )
            ->where('ch.id > 0')
            ->andWhere($qb->expr()->like('name', $qb->expr()->literal('%'.$this->get('request')->query->get('q').'%')))
            ->getQuery();

上面的查询返回以下错误

[Syntax Error] line 0, col 164: Error: Expected '.' or '(', got 'name' 
4

1 回答 1

1

不幸的是,您不能在WHERE子句中“重用”聚合字段。您需要重新创建它。这是MySQL的限制。另一方面,聚合字段用于GROUP,HAVINGORDER子句。

话虽如此,您不能nameandWhere函数调用中使用。尝试将其替换ch.full_name为以确定这是否是有问题的部分。如果是,那么您需要:

  • SELECT从or重复 concat 表达式
  • 当您使用Expr类时,将 concat 隔离到单独的变量中并重用它。
  • 使用HAVING代替WHERE(低效)

$aggr_field = $qb->expr()->concat(
'ch.full_name', 
$qb->expr()->concat(
    $qb->expr()->literal(' ('), 
    'ch.refer_owner_code'
)
), 
$qb->expr()->literal(')')
).' AS HIDDEN name'
);


$qb = $qb->select(array('ch.id'))->andSelect($aggr_field)
>where('ch.id > 0')->andWhere($aggr_field)->getQuery()
于 2013-11-14T10:04:22.917 回答