如何比较doctrine 2中的聚合字段和queryBuilder

时间:2013-11-14 07:34:12

标签: php symfony doctrine-orm

我正在学习symfony2和doctrine2。 我的查询中有错误,我无法找到解决方案。我想知道如何使用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' 

1 个答案:

答案 0 :(得分:1)

不幸的是,您无法在WHERE子句中“重复使用”聚合字段。你需要重新创建它。这是MySQL的限制。另一方面,聚合字段 可以 GROUPHAVINGORDER子句中使用。

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

  • SELECT
  • 重复连接表达式
  • 当您使用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()