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를 사용하여 쿼리를 추가로 수정하겠습니다.)
답변
다음과 같은 것 :
$qb = $entityManager->createQueryBuilder();
$qb->select('count(account.id)');
$qb->from('ZaysoCoreBundle:Account','account');
$count = $qb->getQuery()->getSingleScalarResult();
어떤 사람들은 단순한 DQL을 사용하는 것보다 표현이 더 좋다고 생각합니다. 한 사람은 네 살짜리 답을 편집하기까지 갔다. 나는 그의 편집을 되 돌렸다. 그림을 이동.
답변
쿼리를 형식화하는 다른 방법은 다음과 같습니다.
return $repository->createQueryBuilder('u')
->select('count(u.id)')
->getQuery()
->getSingleScalarResult();
답변
데이터베이스 작업의 모든 논리를 리포지토리로 옮기는 것이 좋습니다.
컨트롤러에서
/* 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 이 좋습니다.
답변
당신이, 더 복잡한 쿼리를 계산으로해야하는 경우 groupBy
, having
등 … 당신은에서 빌릴 수 Doctrine\ORM\Tools\Pagination\Paginator
:
$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);
$totalRows = count($paginator);
답변
에서 직접 방법 Doctrine 2.6
을 사용할 수 있기 때문입니다 . 자세한 내용은 링크를 참조하십시오.count()
EntityRepository
답변
그룹화, 공용체 및 물건을 사용하는 예제.
문제:
$qb = $em->createQueryBuilder()
->select('m.id', 'rm.id')
->from('Model', 'm')
->join('m.relatedModels', 'rm')
->groupBy('m.id');
이것이 작동하려면 가능한 해결책은 맞춤형 수화기와 ‘CUSTOM OUTPUT WALKER HINT’라는 이상한 것을 사용하는 것입니다.
class CountHydrator extends AbstractHydrator
{
const NAME = 'count_hydrator';
const FIELD = 'count';
/**
* {@inheritDoc}
*/
protected function hydrateAllData()
{
return (int)$this->_stmt->fetchColumn(0);
}
}
class CountSqlWalker extends SqlWalker
{
/**
* {@inheritDoc}
*/
public function walkSelectStatement(AST\SelectStatement $AST)
{
return sprintf("SELECT COUNT(*) AS %s FROM (%s) AS t", CountHydrator::FIELD, parent::walkSelectStatement($AST));
}
}
$doctrineConfig->addCustomHydrationMode(CountHydrator::NAME, CountHydrator::class);
// $qb from example above
$countQuery = clone $qb->getQuery();
// Doctrine bug ? Doesn't make a deep copy... (as of "doctrine/orm": "2.4.6")
$countQuery->setParameters($this->getQuery()->getParameters());
// set custom 'hint' stuff
$countQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, CountSqlWalker::class);
$count = $countQuery->getResult(CountHydrator::NAME);
답변
Doctrine DBAL 만 사용하고 Doctrine ORM은 사용하지 않는 사람들에게는 getQuery()
존재하지 않기 때문에 메소드 에 액세스 할 수 없습니다. 그들은 다음과 같은 일을해야합니다.
$qb = new QueryBuilder($conn);
$count = $qb->select("count(id)")->from($tableName)->execute()->fetchColumn(0);
