我正在学习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'
答案 0 :(得分:1)
不幸的是,您无法在WHERE
子句中“重复使用”聚合字段。你需要重新创建它。这是MySQL
的限制。另一方面,聚合字段 可以 在GROUP
,HAVING
和ORDER
子句中使用。
据说,你不能在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()