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

[SOLUCIONADO] Left Join con Select Usando Zend DB

Estas en el tema de Left Join con Select Usando Zend DB en el foro de Zend en Foros del Web. Hola, Zend DB es un componente muy potente de Zend Framework y me ah facilitado la vida inmensamente, pero me topo con un inconveniente a ...
  #1 (permalink)  
Antiguo 18/08/2011, 12:03
Avatar de kivpson  
Fecha de Ingreso: marzo-2011
Mensajes: 37
Antigüedad: 13 años, 8 meses
Puntos: 7
Left Join con Select Usando Zend DB

Hola, Zend DB es un componente muy potente de Zend Framework y me ah facilitado la vida inmensamente, pero me topo con un inconveniente a la hora de hacer la siguiente consulta:

Código:
select
	u.cantidad cantidad_usuarios,
	g.*
from
	grupos g
	left join (select count(*) cantidad from usuarios group by id_grupo) u on u.id_usuario = g.id_usuario
Obviamente la consulta es un ejemplo, mi problema es al quere realizar este tipo de querys usando el framework.

Por otra parte se que se puede realizar querys de forma "manual" y pasarlas a un objeto db, de esta forma:

Código PHP:
$query "
select
    u.cantidad cantidad_usuarios,
    g.*
from
    grupos g
    left join (select count(*) cantidad from usuarios group by id_grupo) u on u.id_usuario = g.id_usuario
"
;

$rs $db->query($query);
$rows = (object) $rs->fetchAll(); 
Pero no es mi proposito obtener el query de esta forma, ya que lo necesito como un objeto select de Zend para pasarlo como parametro al Zend Paginator:

Código PHP:
$rspPag Zend_Paginator::factory($select);
$rspPag->setItemCountPerPage('50');
$rspPag->setCurrentPageNumber($this->_request->getQuery('pagina')); 
Alguién lo ah realizado ya?

Agradezco de antemano la ayuda.

Saludos.
  #2 (permalink)  
Antiguo 18/08/2011, 13:14
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Left Join con Select Usando Zend DB

Primero, ¿por qué indicas que Zend_Paginator tienes que pasar como objeto el valor recibido de Zend_Db? Si Zend_Paginator se lleva muy bien con los array Digo no soy experto, pero con hacer esto
Código PHP:
Ver original
  1. Zend_Paginator::factory($db->fetchAll($query));
Te debe funcionar.

Lo otro, te recomiendo esta lectura, indica como usar los join http://framework.zend.com/manual/en/....building.join
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 18/08/2011, 15:40
Avatar de kivpson  
Fecha de Ingreso: marzo-2011
Mensajes: 37
Antigüedad: 13 años, 8 meses
Puntos: 7
Respuesta: Left Join con Select Usando Zend DB

Cita:
Iniciado por abimaelrc Ver Mensaje
Primero, ¿por qué indicas que Zend_Paginator tienes que pasar como objeto el valor recibido de Zend_Db? Si Zend_Paginator se lleva muy bien con los array Digo no soy experto, pero con hacer esto
Código PHP:
Ver original
  1. Zend_Paginator::factory($db->fetchAll($query));
Te debe funcionar.

Lo otro, te recomiendo esta lectura, indica como usar los join [url]http://framework.zend.com/manual/en/zend.db.select.html#zend.db.select.building.join[/url]
Así es amigo, se lleva muy bien con arrays, el problema es por optimización ya que al pasar un array al zend paginator, estarías pasando toda una consulta sin limits, si asumimos que tenemos una tabla con 500.000 registros, se pasaría esa misma cantidad de elementos al paginador para que los reparta según el numero de items y páginas resultantes, la diferencia con el paso del objeto select, es que el query lo gestiona el zend paginator, osea este es quién añadiría los respectivos limits a la consulta y la realiza.

Por otra parte uso el metodo join de zend, pero en el manual no se especifica como hacer un select dentro de un join, ese es mi inconveniente.

Gracias por responder amigo.
  #4 (permalink)  
Antiguo 18/08/2011, 15:54
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Left Join con Select Usando Zend DB

Deberías buscar info sobre subqueries, igual te dejo unas referencias, no lo he probado dado que no utilizo el componente(personalmente lo veo bastante pobre), espero que te sirvan:

http://stackoverflow.com/questions/1...-using-zend-db
http://stackoverflow.com/questions/1...table-subquery
http://stackoverflow.com/questions/3...nd-db-subquery

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 18/08/2011, 18:22
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Left Join con Select Usando Zend DB

Cita:
Iniciado por kivpson Ver Mensaje
Así es amigo, se lleva muy bien con arrays, el problema es por optimización ya que al pasar un array al zend paginator, estarías pasando toda una consulta sin limits, si asumimos que tenemos una tabla con 500.000 registros, se pasaría esa misma cantidad de elementos al paginador para que los reparta según el numero de items y páginas resultantes, la diferencia con el paso del objeto select, es que el query lo gestiona el zend paginator, osea este es quién añadiría los respectivos limits a la consulta y la realiza.
Te doy un punto a favor
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 18/08/2011, 18:27
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Left Join con Select Usando Zend DB

Cita:
Iniciado por masterpuppet Ver Mensaje
...(personalmente lo veo bastante pobre)...
Siempre lo indicas, ¿aparte de usar Doctrine y sus versiones, que otro método recomiendas entonces usar? Esto es claro en lo que terminas el tutorial de Doctrine que estoy esperando desde que nací jejeje
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 19/08/2011, 04:17
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Left Join con Select Usando Zend DB

No hay aparte abimael, D2 es el camino, algo interesante sera ver que pasa con el componente cuando salga ZF 2 con la integración de D2, solamente utilizaría Zend_Db si el proyecto es muy simple.
__________________
http://es.phptherightway.com/
thats us riders :)
  #8 (permalink)  
Antiguo 21/08/2011, 12:23
Avatar de kivpson  
Fecha de Ingreso: marzo-2011
Mensajes: 37
Antigüedad: 13 años, 8 meses
Puntos: 7
Respuesta: Left Join con Select Usando Zend DB

Tras busquedas e intentos e dado con la solución, claro esto gracias a las sugerencias de masterpuppet, eh aquí la solución:

El Query Orginal deseado:
Código:
SELECT 
	`g`.*, `t`.`total_tarjetas`, `u`.`username` AS `usuario` 
FROM 
	`tarjetas_grupos` AS `g` 
	LEFT JOIN (
		SELECT COUNT(*) AS `total_tarjetas`, `tarjetas_prepago`.`id_grupo` 
		FROM `tarjetas_prepago` 
		GROUP BY `id_grupo`
		) AS `t` ON t.id_grupo=g.id_grupo 
	LEFT JOIN `users` AS `u` ON u.id_user = g.creado_por 
ORDER BY `g`.`id_grupo` DESC
Y la implementación con Zend_Db:

Código PHP:
$tGrupos     = new TarjetasgruposTable();
$tTarjetas     = new TarjetasTable();
$tUsers     = new UsuariosTable();
 
 
$subSelect $tTarjetas->select()
         ->
from(
                 
$tTarjetas->_tablename,
                 array(
                     
'total_tarjetas'=>'COUNT(*)',
                     
'id_grupo')
                 )
         ->
group('id_grupo');
 
 
$select $tGrupos->select()
          ->
setIntegrityCheck(false)
          ->
from(
                  array(
'g'=>$tGrupos->_tablename),
                  array(
                      
'g.*')
                  )
          ->
joinleft(
                  array(
't'=>$subSelect),
                  
't.id_grupo=g.id_grupo',
                  array(
                      
'total_tarjetas'=>'t.total_tarjetas'
                  
)
                  )
          ->
joinleft(
                  array(
'u'=>$tUsers->_tablename),
                  
'u.id_user = g.creado_por',
                  array(
                      
'usuario'=>'u.username'
                  
)
                  )
         ->
order('g.'.$table->_id.' DESC'); 
Lo del _tablename es una variable que especifica el nombre de la tabla, la cual se define en el objeto Zend_Db_Table.

Gracias a todos los que contestarón.

Saludos!

Etiquetas: frameworks-y-php-orientado-a-objetos, zend-db, zend-framework, zend-paginator
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 20:58.