symfony2 seleccionar registros primeros numero los limite limitar hacer filas fila contador consultas consulta como doctrine limit dql

doctrine - seleccionar - ¿Limitar una consulta de doctrina con una colección fetch-join?



seleccionar los primeros 10 registros oracle (4)

Tengo una consulta de doctrina que devuelve publicaciones de blog y sus comentarios:

SELECT b, c FROM BlogPost b LEFT JOIN b.comments c

Me gustaría limitar los resultados a 10 publicaciones de blog. De acuerdo con la documentación de DQL, setMaxResults() no funciona correctamente en las consultas que recogen una colección (comentarios en este caso):

Si su consulta contiene una colección combinada de búsqueda que especifica que los métodos de límite de resultados no funcionan como esperaría. Establecer resultados máximos restringe el número de filas de resultados de la base de datos, sin embargo, en el caso de las colecciones unidas por búsqueda, una entidad raíz puede aparecer en muchas filas, hidratando efectivamente menos que el número especificado de resultados.

¿Cómo puedo limitar adecuadamente una consulta de doctrina que contiene una colección de búsqueda conjunta (en este caso, limitar los resultados a 10 publicaciones de blog)?


A pesar de que este es uno antiguo, este tiene un alto puntaje en google en busca de doctrina. Rápidamente me hizo buscar "paginador de doctrina" y después de insistir en buscar en Google que eso era lo que estaba buscando (no paginación de doctrina) todavía tenía algunos problemas para averiguar cómo usarlo.

Tal vez buscó mal pero realmente no pudo encontrar buena documentación en el objeto paginador. De todas formas; para obtener los resultados utilicé getIterator y funcionó bien.

Mi código tiene fuentes que contienen enlaces rss y artículos que son artículos del feed rss. Así que en este ejemplo obtendré una Fuente y todos sus artículos. Este código es de Symfony.

// get the articles (latest first) from source 743 $q=$this->getDoctrine()->getManager() ->createQuery(''select s, a from MyCompanyRssBundle:Source s join s.Articles a where s.id = :id order by a.id desc'') ->setParameter(''id'',743); $q->setMaxResults(1); // this limits Articles to be only 1 // when using $q->getResult(); $sources=new Paginator($q, $fetchJoin = true); $sources=$sources->getIterator(); var_dump($sources[0]->getArticles());


Este repositorio http://github.com/beberlei/DoctrineExtensions tiene una extensión de paginador que funciona con fetch joins. Básicamente, tiene que hacer 3 instrucciones SELECT, todas las cuales esta extensión lo hace por usted.


Hizo lo mismo con un constructor de consultas y funciona. Tal vez algo más es el problema?

$qb->add(''select'', ''b, c, ch, g'') ->add(''from'', ''Broadcast b'') ->add(''groupBy'', ''b.title'') ->add(''where'', ''b.imageBig != /'/''') ->add(''orderBy'', ''b.starttime ASC'') ->setMaxResults(10) ->leftJoin(''b.category'', ''c'') ->leftJoin(''b.channel'', ''ch'') ->leftJoin(''b.genre'', ''g'')


Paginate se fusionó con la doctrina 2.2 Y la nueva versión 2.0.10 de symfony2 es compatible con.

Ahora usalo asi

//use Doctrine paginator use Doctrine/ORM/Tools/Pagination/Paginator;

Escriba su consulta y luego llame a los resultados de esa manera.

$query->setMaxResults($limit); $query->setFirstResult($offset); $results = new Paginator($query, $fetchJoin = true);

Espero que esto te ayudará.

Nota: Si está utilizando SF2 2.0.10, debe actualizar los archivos deps y deps.lock y especificar la versión 2.2 para los paquetes de Doctrine.