我正在使用Doctrine的QueryBuilder构建一个查询,我想从查询中获得结果的总数。
$repository = $em->getRepository('FooBundle:Foo');
$qb = $repository->createQueryBuilder('n')
->where('n.bar = :bar')
->setParameter('bar', $bar);
$query = $qb->getQuery();
//this doesn't work
$totalrows = $query->getResult()->count();
我只想对这个查询运行一次计数,以获得总行数,而不是返回实际结果。(在此计数查询之后,我将使用maxResults进一步修改查询以进行分页。)
发布于 2012-02-10 01:38:10
类似于:
$qb = $entityManager->createQueryBuilder();
$qb->select('count(account.id)');
$qb->from('ZaysoCoreBundle:Account','account');
$count = $qb->getQuery()->getSingleScalarResult();
有些人觉得表达式在某种程度上比直接使用DQL更好。其中一个人甚至编辑了一个四年前的答案。我回滚了他的编辑。去想一想。
发布于 2014-11-23 03:55:00
下面是另一种格式化查询的方法:
return $repository->createQueryBuilder('u')
->select('count(u.id)')
->getQuery()
->getSingleScalarResult();
发布于 2015-11-11 07:51:48
最好将处理数据库的所有逻辑都转移到存储库。
所以在控制器中,你可以写
/* you can also inject "FooRepository $repository" using autowire */
$repository = $this->getDoctrine()->getRepository(Foo::class);
$count = $repository->count();
在Repository/FooRepository.php
中
public function count()
{
$qb = $repository->createQueryBuilder('t');
return $qb
->select('count(t.id)')
->getQuery()
->getSingleScalarResult();
}
最好将$qb = ...
移到单独的行中,以防您想要创建复杂的表达式,例如
public function count()
{
$qb = $repository->createQueryBuilder('t');
return $qb
->select('count(t.id)')
->where($qb->expr()->isNotNull('t.fieldName'))
->andWhere($qb->expr()->orX(
$qb->expr()->in('t.fieldName2', 0),
$qb->expr()->isNull('t.fieldName2')
))
->getQuery()
->getSingleScalarResult();
}
还可以考虑缓存查询结果- http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers
public function count()
{
$qb = $repository->createQueryBuilder('t');
return $qb
->select('count(t.id)')
->getQuery()
->useQueryCache(true)
->useResultCache(true, 3600)
->getSingleScalarResult();
}
在一些简单的情况下,使用EXTRA_LAZY
实体关系比较好
https://stackoverflow.com/questions/9214471
复制相似问题