Estoy usando Doctrine's QueryBuilder para construir una consulta, y quiero obtener el recuento total de resultados de la consulta.
$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();
Solo quiero ejecutar un recuento en esta consulta para obtener las filas totales, pero no devolver los resultados reales. (Después de esta consulta de conteo, voy a modificar aún más la consulta con maxResults para paginación).
symfony
doctrine-orm
Acyra
fuente
fuente
Respuestas:
Algo como:
Algunas personas sienten que las expresiones son de alguna manera mejores que simplemente usar DQL directo. Incluso se llegó a editar una respuesta de cuatro años. Hice rodar su edición hacia atrás. Imagínate.
fuente
bar = $bar
);)count()
on$query->getResult()
está haciendo que la consulta devuelva los resultados (que es lo que no quería). Creo que esto debería ser aceptado respuesta$qb->select($qb->expr()->count('account.id'))
select('count(account.id)')
lugar deselect('count(account)')
?Aquí hay otra forma de formatear la consulta:
fuente
return ($qb = $repository->createQueryBuilder('u'))->select($qb->expr()->count('u.id'))->getQuery()->getSingleScalarResult();
Es mejor mover toda la lógica de trabajar con bases de datos a repositores.
Entonces en el controlador escribes
Y en
Repository/FooRepository.php
Es mejor moverse
$qb = ...
a una fila separada en caso de que desee crear expresiones complejas comoTambién piense en almacenar en caché el resultado de su consulta: http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers
En algunos casos simples, usar las
EXTRA_LAZY
relaciones entre entidades es buenohttp://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html
fuente
Si necesita contar una consulta más compleja, con
groupBy
,having
etc ... Puede tomar prestado deDoctrine\ORM\Tools\Pagination\Paginator
:fuente
SELECT COUNT(*) AS dctrn_count FROM (_ORIGINAL_SQL_) dctrn_result) dctrn_table
que en realidad no es nada especial, sino una conocida solución COUNT (*)Dado
Doctrine 2.6
que es posible utilizar elcount()
método directamente desdeEntityRepository
. Para más detalles ver el enlace.https://github.com/doctrine/doctrine2/blob/77e3e5c96c1beec7b28443c5b59145eeadbc0baf/lib/Doctrine/ORM/EntityRepository.php#L161
fuente
Ejemplo de trabajo con agrupación, unión y demás.
Problema:
Para que esto funcione, la solución posible es usar un hidratador personalizado y esta cosa extraña llamada 'CONSEJO DEL CAMINANTE DE SALIDA PERSONALIZADA':
fuente
Para las personas que usan solo Doctrine DBAL y no Doctrine ORM, no podrán acceder al
getQuery()
método porque no existe. Necesitan hacer algo como lo siguiente.fuente
Para contar elementos después de cierto número de elementos (desplazamiento), $ qb-> setFirstResults () no se puede aplicar en este caso, ya que no funciona como una condición de consulta, sino como un desplazamiento del resultado de la consulta para un rango de elementos seleccionados ( es decir, setFirstResult no se puede usar junto con COUNT). Entonces, para contar los elementos que quedan, simplemente hice lo siguiente:
¿Alguien sabe más forma limpia de hacerlo?
fuente
Agregar el siguiente método a su repositorio debería permitirle llamar
$repo->getCourseCount()
desde su Controlador.fuente
También puede obtener el número de datos utilizando la función de conteo.
fuente