Foros del Web » Programando para Internet » PHP » Zend »

Zend_Paginator junto con relaciones de tablas?

Estas en el tema de Zend_Paginator junto con relaciones de tablas? en el foro de Zend en Foros del Web. Cómo va? Aparezco aquí nuevamente a realizar una pregunta para aquellos que más experiencia en utilizar Zend Framework tengan. El tema es el siguiente: Estoy ...
  #1 (permalink)  
Antiguo 21/10/2009, 16:03
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años, 1 mes
Puntos: 69
Zend_Paginator junto con relaciones de tablas?

Cómo va?
Aparezco aquí nuevamente a realizar una pregunta para aquellos que más experiencia en utilizar Zend Framework tengan.

El tema es el siguiente: Estoy trabajando con mis modelos extendiendo de Zend_Db_Table_Abstract y como tal, cuando necesito acceder a información que está en tablas relacionadas, tengo métodos que devuelven lo que devuelve un método findDependentRowset, findParentRow o findManyToManyRowset.
Hasta ahi todo bien. Si necesito la información, la obtengo fácilmente.

El problema comienza ahora, que tengo MUCHA información, y por ende necesito paginar lo que tengo. Para esto lo que estaba interesado en hacer es utilizar Zend_Paginator, pero este componente necesita que se le pase un Zend_Db_Table_Select para poder calcular la cantidad de páginas y dicho Zend_Db_Table_Select no lo puedo obtener fácilmente, porque las funciones findDepententRowset, findParentRow, etc, no lo generan externamente.

Entonces me veo en un problema. Qué hago? duplicar la lógica de creación de esos Selects me parece una mala idea. Estaba pensando en extender a Zend_Db_Table_Rowset para que guarde una instancia del Zend_Db_Table_Select que se utilizó para generarse y de ahí, tomarlo para utilizarlo en el Zend_Paginator, pero no se si me estoy perdiendo algo o qué.

Alguién que me tire una mano para ver como se puede resolver esto?

Gracias !
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #2 (permalink)  
Antiguo 21/10/2009, 23:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Zend_Paginator junto con relaciones de tablas?

Lo mejor para estos casos y beneficio de usar Zend es esa extensibilidad, tu puedes programar un adapter que extienda de Zend_Paginator_Adapter_Interface y establecer el query que necesites para obtener los items y con eso no tendrías problema.

Saludos.
  #3 (permalink)  
Antiguo 22/10/2009, 05:09
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años, 1 mes
Puntos: 69
Respuesta: Zend_Paginator junto con relaciones de tablas?

Bueno, el tema es que SI tengo problema, porque tendría que estar duplicando código y justamente lo que no quiero, es tener que generar TODO ese query, con funciones que no puedo invocar fuera de Zend_Db_Table_Row_Abstract.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #4 (permalink)  
Antiguo 22/10/2009, 07:12
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 10 meses
Puntos: 45
Respuesta: Zend_Paginator junto con relaciones de tablas?

Hola Webstudio
Zend_Paginator no solo permite que le pases Zend_Db_Table_Select también le puedes pasar un Array o un Iterator http://framework.zend.com/manual/en/...tor.usage.html.

Talvez sea mejor eso que tratar de pasare un Select.

Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #5 (permalink)  
Antiguo 22/10/2009, 07:32
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 19 años, 3 meses
Puntos: 55
Respuesta: Zend_Paginator junto con relaciones de tablas?

el tema de pasar un array se me hace q se pondria bastante "heavy" cuando tenes una tabla con muuuuchos datos suponte 10millones de registros
de alguna forma hay q modificar el modelo para q puedas sacar el select() y pasarlo al pagnator
__________________
Degiovanni Emilio
developtus.com
  #6 (permalink)  
Antiguo 22/10/2009, 08:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Zend_Paginator junto con relaciones de tablas?

Otra opción que se me ocurre es usar el Zend Db Profiler para inspeccionar el query como tal que es enviado a la BDD y en base a eso generar tu Select para calcular los rows.

Saludos.
  #7 (permalink)  
Antiguo 22/10/2009, 08:37
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 10 meses
Puntos: 45
Respuesta: Zend_Paginator junto con relaciones de tablas?

Cita:
Iniciado por GatorV Ver Mensaje
Otra opción que se me ocurre es usar el Zend Db Profiler para inspeccionar el query como tal que es enviado a la BDD y en base a eso generar tu Select para calcular los rows.

Saludos.
Lo mismo pense, pero se tendría que recorrer todos los querys para dar con la consulta exacta, ademas se tendría que habilitar profiler y en modo de producción no se aconseja hacer eso... o talvez se pueda llamar de otra manera
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #8 (permalink)  
Antiguo 22/10/2009, 08:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Zend_Paginator junto con relaciones de tablas?

Pero lo puedes hacer solo para la consulta actual, no es necesario que lo haga site-wide, o sea en lugar de llamar directamente a findManyToMany por ejemplo, hacer una función que habilite el profiler, obtenga los Dependant, extraiga la query, y deshabilite el profiler y regrese lo resultados.

Saludos.
  #9 (permalink)  
Antiguo 22/10/2009, 09:28
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años, 1 mes
Puntos: 69
Respuesta: Zend_Paginator junto con relaciones de tablas?

Gente, gracias por pasarme links al "manual". Creanme, ya lo leí TODO y si vengo acá es porque busco alguien que haya tenido o tenga el mismo problema, para ver si encontraron alguna solución.

Yo finalmente llegué a una solución "de compromiso" que me permite hacer lo que quiero, pero no me convence EN LO MÁS MINIMO.

1) Creé dos nuevas clases: App_Db_Table_Row y App_Db_Table_Rowset.
2) Configuré a mis Modelos para que sus rowsetClass y rowClass sean (o extiendan) estas dos clases.
3) En App_Db_Table_Row, sobrecargué el médoto findManyToManyRowset (copiándolo directamente de Zend_Db_Table_Row_Abstract) para que al momento de crear un rowset y devolverlo, le pase un parámetro extra, que es el Select utilizado para crear dicho Rowset.
4) En App_Db_Table_Rowset, sobrecargué el constructor para que reconozca este nuevo parámetro, y lo cargue dentro de un atributo. Además agregué un getSelect() para pedir dicho Select.
5) en la vista ahora, tengo un View_Helper llamado pagination, al cual le paso el Rowset, la página actual y la cantidad de resultados por página, y me genera la paginación.

No es la solución que más me gusta, para ser sincero. Recién ahora leo la respuesta de GatorV (joder Christopher, me podrías haber dicho eso antes) y me gusta la posibilidad de utilizar el Profiler para pedir el último query, crear un Zend_Db_Select en base a este, y eso mismo guardarlo de alguna manera en el Rowset (porque sino, el Select queda escondido dentro del findManyToManyRowset).

Por ahora me saqué el problema de encima, pero estaría bueno pensar en una solución completa a este problema: crear un Zend_Paginator_Adapter para este tipo de caso en particular, con la solución internmedia entre un Rowset modificado y Zend_Db_Profiler.

Qué opinan?
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #10 (permalink)  
Antiguo 22/10/2009, 09:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Zend_Paginator junto con relaciones de tablas?

Lo siento, se me ocurrio apenas ahorita ya que es una solucion que estoy implementando para otra cosa pero es algo similar.

Saludos.
  #11 (permalink)  
Antiguo 25/10/2009, 18:11
 
Fecha de Ingreso: febrero-2001
Mensajes: 1.374
Antigüedad: 23 años, 10 meses
Puntos: 11
Respuesta: Zend_Paginator junto con relaciones de tablas?

Hola Pablo,

Respondiendo a tu mensaje, espero que encuentres este ejemplo util:

Código PHP:
<?php
class Users extends Zend_Db_Table_Abstract
{
    protected 
$_name 'users';
    protected 
$_primary 'id';
    
    public function 
getByGroupId($groupid$page 1
    {
        
$select $this->select()
            ->
from($this->_name)
            ->
where('group_id = ?'$groupid);
            
        
$adapter = new Zend_Paginator_Adapter_DbTableSelect($select);
        
        
$count = clone $select;
        
$count->reset(Zend_Db_Select::COLUMNS);
        
$count->reset(Zend_Db_Select::FROM);
        
$count->from($this->_name, new Zend_Db_Expr('COUNT(*) AS total'));
        
        
$adapter->setRowCount($count);
        
        
$paginator = new Zend_Paginator($adapter);
        
$paginator->setItemsCountPerPage(10);
        
$paginator->setCurrentPageNumber($page);
        
        return 
$paginator;
    }
}
Un saludo

Última edición por Tukzone; 25/10/2009 a las 19:06 Razón: EDIT: User to Users
  #12 (permalink)  
Antiguo 26/10/2009, 12:14
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años, 8 meses
Puntos: 37
Respuesta: Zend_Paginator junto con relaciones de tablas?

@webstudio.

Vos podes pasarle a Zend_Paginator cualquier cosa iterable. para esto podes usar las SPL.

findDependentRowset, findParentRow o findManyToManyRowset te devuelven un array.

Ese array podes paraselo al factory del paginator asi

Código PHP:
$users = new  ArrayIterator$model->metodoQueDevuelveunArray() ) );
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Iterator$users ) ); 
__________________
blog
  #13 (permalink)  
Antiguo 27/10/2009, 13:32
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años, 1 mes
Puntos: 69
Respuesta: Zend_Paginator junto con relaciones de tablas?

Lo se, gracias :)
El tema es que findDependentRowset o findManyToManyRowset devuelven un Zend_Db_Table_Rowset ( que si, que es iterable ) y si se lo paso a Zend_Paginator::factory() no reconoce ningún adapter para este tipo ( porque no hay, claro), y segundo, si hacés lo que decís vos, le paso el Rowset pero Iterable, me va a iterar sobre los elementos que le paso (una página de resultados).

No sirve. Porque Zend_Paginator se queda sin saber cuál es el TOTAL de elementos.

Y así seguimos en la misma.

Cita:
Iniciado por pablofmorales Ver Mensaje
@webstudio.

Vos podes pasarle a Zend_Paginator cualquier cosa iterable. para esto podes usar las SPL.

findDependentRowset, findParentRow o findManyToManyRowset te devuelven un array.

Ese array podes paraselo al factory del paginator asi

Código PHP:
$users = new  ArrayIterator$model->metodoQueDevuelveunArray() ) );
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Iterator$users ) ); 
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #14 (permalink)  
Antiguo 27/10/2009, 13:37
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años, 8 meses
Puntos: 37
Respuesta: Zend_Paginator junto con relaciones de tablas?

No.

Si sabe el total. El unico problema que tenes es que trae todos los resultados, y despues los divide. Esto hace que sea mucho menos optima la pagina. Pero para eso tenes que usar Zend_Db_Select para que sea mas optimo.

pero Paginar te va a paginar Bien.
__________________
blog
  #15 (permalink)  
Antiguo 28/10/2009, 08:33
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años, 1 mes
Puntos: 69
Respuesta: Zend_Paginator junto con relaciones de tablas?

Claro, lo que pasa es que me olvidé de mencionarte una cosa...

En mi caso, tengo un Modelo "Proyectos" y tiene un método llamado findComentarios. yo a ESTE método, le paso la cantidad que quiero, y un número de página (opcional). Ahi dentro es donde genero un Zend_Db_Table_Select con los datos que le paso, le pongo un order si fuera necesario, un where, si fuera necesario, y AHI llamo a findDependentRowset o findManyToMayRowset, devolviendo un Rowset.

Hago esto como vos decís, para evitar hacer un query que pida TODOS los datos, pero para meterle un Paginator, es como que tengo que re-crear el Select (que en general no me jode, pero un Select de un findManyToManyRowset() es muy hinchabolas).

Igualmente, por ahora lo tengo resuelto, aunque como dije, no me cierra. En un próximo proyecto que comienzo ahora, voy a probar otra perspectiva. Voy a ver de darle más pelota al concepto de Data Transfer Objects y Data Mappers, a ver si es más claro. Eso, o me rompo el bocho con Doctrine.

Cita:
Iniciado por pablofmorales Ver Mensaje
No.

Si sabe el total. El unico problema que tenes es que trae todos los resultados, y despues los divide. Esto hace que sea mucho menos optima la pagina. Pero para eso tenes que usar Zend_Db_Select para que sea mas optimo.

pero Paginar te va a paginar Bien.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #16 (permalink)  
Antiguo 28/10/2009, 13:17
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años, 8 meses
Puntos: 37
Respuesta: Zend_Paginator junto con relaciones de tablas?

Uso muy poco las relaciones de tablas como propone ZF, nunca me aporto grandes beneficios, y me parece mucho mas comodo usar joins. Con Doctraine anda bastante bien, hay un adapter dando vueltas por internet es bastante simple hacerlo andar.

Para tu problema actual. No es mejor darle el query al Paginator y el que se arregle? Asi evitas agregar mas logica en los modelos, que puede solucionar Zend_Paginator. El solo te agrega los limit, no veo el porque deberias vos pasarle un query limitado.

Con respecto a los ejemplos que hay en el quickstar que usan data mapper, yo empeze a implementarlo y me parecio totalmentente inecesario y dificil d mantener. Se generan modelos interminables. Y no vi que aporte nada interesante.
__________________
blog
  #17 (permalink)  
Antiguo 29/10/2009, 11:04
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años, 1 mes
Puntos: 69
Respuesta: Zend_Paginator junto con relaciones de tablas?

El concepto de los Data Mappers y DTO está realmente bueno, es muy flexible y a la hora de la hora, bien implementado, te facilita la vida. La cagada, como decís vos, es tener que generar TODAS las putas clases al comienzo, con todos los métodos y relaciones y la mar en coche. Bajón.

Para eso está bueno tener algún tipo de código que indicadas las relaciones entre tablas, te genere el código sola, pero eso de por si es un proyecto faraónico pareciera.

Definitivamente, Doctrine parece una buena solución para la próxima. Ya me bajé el manual y estos días lo voy a comenzar a imprimir y leer.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #18 (permalink)  
Antiguo 29/10/2009, 11:54
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años, 8 meses
Puntos: 37
Respuesta: Zend_Paginator junto con relaciones de tablas?

Despues si podes comenta como te fue con Doctrine. Tuve muy poca experiencia usandolo
__________________
blog
  #19 (permalink)  
Antiguo 29/10/2009, 21:41
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 10 meses
Puntos: 45
Respuesta: Zend_Paginator junto con relaciones de tablas?

Cita:
Iniciado por Webstudio Ver Mensaje
Definitivamente, Doctrine parece una buena solución para la próxima. Ya me bajé el manual y estos días lo voy a comenzar a imprimir y leer.
Zend buscará integrarse mejor con Doctrine
http://www.symfony.es/2009/10/29/zen...ante-doctrine/

Saludos!
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:23.