首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Doctrine QueryBuilder中计算行数

在Doctrine QueryBuilder中计算行数
EN

Stack Overflow用户
提问于 2012-02-10 00:10:47
回答 10查看 282.7K关注 0票数 217

我正在使用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进一步修改查询以进行分页。)

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2012-02-10 01:38:10

类似于:

$qb = $entityManager->createQueryBuilder();
$qb->select('count(account.id)');
$qb->from('ZaysoCoreBundle:Account','account');

$count = $qb->getQuery()->getSingleScalarResult();

有些人觉得表达式在某种程度上比直接使用DQL更好。其中一个人甚至编辑了一个四年前的答案。我回滚了他的编辑。去想一想。

票数 514
EN

Stack Overflow用户

发布于 2014-11-23 03:55:00

下面是另一种格式化查询的方法:

return $repository->createQueryBuilder('u')
            ->select('count(u.id)')
            ->getQuery()
            ->getSingleScalarResult();
票数 59
EN

Stack Overflow用户

发布于 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实体关系比较好

http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9214471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档