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

Consulta de Join con Zend Framework

Estas en el tema de Consulta de Join con Zend Framework en el foro de Zend en Foros del Web. Buenas Comunidad. Tengo una pregunta. Tengo el siguiente modelo. Código PHP: <?php class  Application_Model_DbTable_Projects  extends  Zend_Db_Table_Abstract {     protected  $_name  =  'projects' ;           public function  listProject ...
  #1 (permalink)  
Antiguo 26/10/2011, 08:38
Avatar de ApipeMc  
Fecha de Ingreso: septiembre-2010
Ubicación: Medellín, Antioquia, Colombia
Mensajes: 76
Antigüedad: 13 años, 6 meses
Puntos: 1
Consulta de Join con Zend Framework

Buenas Comunidad.
Tengo una pregunta. Tengo el siguiente modelo.
Código PHP:
<?php
class Application_Model_DbTable_Projects extends Zend_Db_Table_Abstract{

    protected 
$_name 'projects'
    
    public function 
listProject($id){

        
$select $this->select()
                       ->
from(array('p'  => 'projects'))                       
                           ->
join(array('pm' => 'permissions'),'p.Id_Permission = pm.Id_Permission', array())
                           ->
join(array('l'  => 'languages'),  'p.Id_Language   = l.Id_Language',array())                                                      
                       ->
where('p.Id_User_Project = '.(int)$id)
                       ->
where('p.State_Project = 1')
                       ->
where('pm.State_Permission = 1')
                       ->
where('l.State_Language = 1');
        
        return 
parent::fetchAll($select);
    }    
    
    public function 
AddProject(){
        
    }
    
}
Me devuelve los datos correctamente:
Código PHP:
    [_data:protected] => Array
        (
            [
0] => Array
                (
                    [
Id_Project] => 1
                    
[Id_User_Project] => 1
                    
[Name_Project] => New Project
                    
[Description] => Project etc.....
                    [
Id_Language] => 1
                    
[Id_Permission] => 1
                    
[State_Project] => 1
                
)

            [
1] => Array
                (
                    [
Id_Project] => 2
                    
[Id_User_Project] => 1
                    
[Name_Project] => New Project 2
                    
[Description] => Otro Proyectp
                    
[Id_Language] => 1
                    
[Id_Permission] => 1
                    
[State_Project] => 1
                
)

        ) 
Pero mi pregunta es como hago para que tambien me traiga los datos de las demas tablas que le estoy haciendo el join
  #2 (permalink)  
Antiguo 26/10/2011, 09:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Consulta de Join con Zend Framework

El último parámetro del join, son las columnas a seleccionar de ese join, necesitas ahi agregarlas.

Saludos.
  #3 (permalink)  
Antiguo 26/10/2011, 09:48
Avatar de ApipeMc  
Fecha de Ingreso: septiembre-2010
Ubicación: Medellín, Antioquia, Colombia
Mensajes: 76
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: Consulta de Join con Zend Framework

Ya le he intentado pero me sale el siguiente error.

Código PHP:
Ver original
  1. $select = $this->select()
  2.                        ->from(array('p'  => 'projects'))                       
  3.                            ->join(array('pm' => 'permissions'),'p.Id_Permission = pm.Id_Permission', array('pm.Description' =>'Description'))
  4.                            ->join(array('l'  => 'languages'),  'p.Id_Language   = l.Id_Language',array())                                                  
  5.                        ->where('p.Id_User_Project = '.(int)$id)
  6.                        ->where('p.State_Project = 1')
  7.                        ->where('pm.State_Permission = 1')
  8.                        ->where('l.State_Language = 1');

Warning: Select query cannot join with another table
  #4 (permalink)  
Antiguo 26/10/2011, 09:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Consulta de Join con Zend Framework

Tienes que indicarle que no chequee la integridad, y con eso te va a devolver objetos "readonly".

Código PHP:
Ver original
  1. $select->setIntegrityCheck(false)->from()...
  #5 (permalink)  
Antiguo 26/10/2011, 10:18
Avatar de ApipeMc  
Fecha de Ingreso: septiembre-2010
Ubicación: Medellín, Antioquia, Colombia
Mensajes: 76
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: Consulta de Join con Zend Framework

Gracias me fue de mucha ayuda.
aca dejo el ejemplo como lo termine:

Código PHP:
Ver original
  1. <?php
  2. class Application_Model_DbTable_Projects extends Zend_Db_Table_Abstract{
  3.  
  4.     protected $_name = 'projects';
  5.    
  6.     public function listProject($id){
  7.        
  8.         $select = $this->select()
  9.                        ->from(array('p'  => 'projects'))                       
  10.                            ->join(array('pm' => 'permissions'),'p.Id_Permission = pm.Id_Permission', array('Name_Permission'=>'Description'))
  11.                            ->join(array('l'  => 'languages'),  'p.Id_Language   = l.Id_Language',array('Name_Language'))                                                   
  12.                        ->where('p.Id_User_Project = '.(int)$id)
  13.                        ->where('p.State_Project = 1')
  14.                        ->where('pm.State_Permission = 1')
  15.                        ->where('l.State_Language = 1');
  16.         $select->setIntegrityCheck(false);
  17.                        
  18.         return $select->query()->fetchAll();;
  19.     }  
  20.    
  21.     public function AddProject(){
  22.        
  23.     }
  24.    
  25. }
  #6 (permalink)  
Antiguo 26/10/2011, 17:46
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: Consulta de Join con Zend Framework

Yo evito usar el Integrity check, mas que nada, porque es un hack.

prefiero usar $this->getAdapter()->select() y $this->getAdapter()->fetchAll()
__________________
blog
  #7 (permalink)  
Antiguo 26/10/2011, 19:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Consulta de Join con Zend Framework

No es un hack, lo que hace es devolverte un array de objetos que tengas definido, y si por ejemplo tienes algunas modificaciones a tu objeto row, te va a devolver entradas de ese row con los demás datos.

Si bien no es lo ideal es lo más parecido a un ORM que tiene Zend, lo mejor es usar D2 directamente.

Saludos.
  #8 (permalink)  
Antiguo 26/10/2011, 19:55
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: Consulta de Join con Zend Framework

Cita:
Iniciado por GatorV Ver Mensaje
No es un hack, lo que hace es devolverte un array de objetos que tengas definido, y si por ejemplo tienes algunas modificaciones a tu objeto row, te va a devolver entradas de ese row con los demás datos.

Si bien no es lo ideal es lo más parecido a un ORM que tiene Zend, lo mejor es usar D2 directamente.

Saludos.
(thinking...)

lo de setIntegrityCheck, recuerdo que salio en la version 1.5 si mal no recuerdo, y fue porque antes se podia hacer un join sin necesidad de esto, pero usarlo de esta manera rompia con el patron Row Data Gateway , que esto dice que el objeto que se devuelve debe ser identico al Row en donde se guarda, el join no seria identico, sino seria el Row de una tabla especifica y aca tendrias dos Rows. Entendi que el integrityCheck era un hack para los que venian usando el join de esta forma, pudieran usarlo, pero con conciencia de que no es como deberia, sino ese setIntegrityCheck deberia estar en false por defecto.


Confirmame si me equivoco, pero vengo arrastrando esto desde hace rato.
__________________
blog
  #9 (permalink)  
Antiguo 26/10/2011, 20:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Consulta de Join con Zend Framework

La idea era poder permitir hacer un join (que a veces es muy necesario), y a la vez poder tener tu objeto de forma natural.

Si bien es un cierto hack, es algo necesario cuando necesitas tener tu objeto, por ejemplo supongamos este caso:

Código PHP:
Ver original
  1. class MyUserTable extends Zend_Row_Table_Abstract
  2. {
  3.        protected $_rowClass = 'MyUserRow';
  4.  
  5.        public function getUsersByType(); // Aqui haces un join con otra tabla type
  6. }
  7.  
  8. class MyUserRow extends Zend_Db_Table_Row_Abstract
  9. {
  10.        public function getRegisteredDate(); // Aqui tienes logica para formatear la fecha desde la bdd
  11. }

Si tu haces el select desde el adapter, te va a devolver un array, o un array de objetos (stdClass), y si requieres de tu objeto MyUserRow para realizar cierta lógica permitiendo el join, sin el "hack" no sería posible más que creando manualmente el objeto e inyectando los datos. Es mejor el "hack" y dejar que el FW lo haga por ti.

Repito es algo lo más base a lo que es un ORM que sería lo ideal.

Saludos.
  #10 (permalink)  
Antiguo 26/10/2011, 20:16
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: Consulta de Join con Zend Framework

Cita:
Iniciado por GatorV Ver Mensaje
La idea era poder permitir hacer un join (que a veces es muy necesario), y a la vez poder tener tu objeto de forma natural.

Si bien es un cierto hack, es algo necesario cuando necesitas tener tu objeto, por ejemplo supongamos este caso:

Código PHP:
Ver original
  1. class MyUserTable extends Zend_Row_Table_Abstract
  2. {
  3.        protected $_rowClass = 'MyUserRow';
  4.  
  5.        public function getUsersByType(); // Aqui haces un join con otra tabla type
  6. }
  7.  
  8. class MyUserRow extends Zend_Db_Table_Row_Abstract
  9. {
  10.        public function getRegisteredDate(); // Aqui tienes logica para formatear la fecha desde la bdd
  11. }

Si tu haces el select desde el adapter, te va a devolver un array, o un array de objetos (stdClass), y si requieres de tu objeto MyUserRow para realizar cierta lógica permitiendo el join, sin el "hack" no sería posible más que creando manualmente el objeto e inyectando los datos. Es mejor el "hack" y dejar que el FW lo haga por ti.

Repito es algo lo más base a lo que es un ORM que sería lo ideal.

Saludos.
No te discuto que es comodo, por ahi queda mejor que usar el adapter que te lo devuelve como un array, pero si queria que me aclares que era un hack. Inicialmente se penso esto para usar un patron, que despues ellos mismos termianron parcheando o no usandolo de la forma "correcta".

Es una pena, porque a esta altura ZF deberia tener integrado Doctrine como si lo hace SF2.

La queja habitual de sf2 es lo que demoras en configurar un proyecto, pero lo que demoras en configurar te lo ahorras en escribir modulos al pedo, por ejemplo la administracion de usuarios y ACL, ZF deberia poder generarte un admin como lo hace Django sin problemas, un semi framework como django queda mejor parado que ZF solo porque trae este feature, siendo que ZF trae muchos mas componentes para otras cosas.

Tampoco un ORM es ideal para todos los proyectos, deberia ser facilmente cambiable por otro tipo como Mongo u Zend_Db pelao. Pero creo que a esta altura deberiamos tener integracion por default con doctrine, y un mini admin.

Y no estar discutiendo como hacer un join
__________________
blog
  #11 (permalink)  
Antiguo 26/10/2011, 20:33
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Consulta de Join con Zend Framework

Pues sí se puede ver como un hack, yo a mi parecer lo veo como un feature.

No te discuto que debería de tener una integración ya nativa, pero es lo que más me gusta de Zend, el potencial que tiene para poder integregarle, como bien dices Pdo, Zend_Db, Doctrine, etc. no te "obliga" a hacer nada con una set de reglas.

Aunque como bien dices esta desacoplación hacen que sea mas lento el desarrollo inicial (al no tener por ejemplo generadores, scaffolding, etc.) Pero creo que lo vale, y ahora con ZF2, va a ser más sencillo escribir lo necesario, para poder trabajar de forma rápida.

Creo que lo que más me gusta de Zend es la comunidad, muchos desarrolladores brindan componentes, y nada evita que alguien pueda ir y proponer una mejora y compartirla (por ejemplo vía Github, etc.).

Pues yo no discuto el como hacer el join, simplemente le indique a @ApipeMC como hacer lo que quería hacer, sería peor que Zend no te permitiera hacer el join, y te quedarás a parchar el nucleo o algo similar.
  #12 (permalink)  
Antiguo 26/10/2011, 21:20
Avatar de pablofmorales  
Fecha de Ingreso: abril-2008
Ubicación: Buenos Aires, Argentina, Argentina
Mensajes: 222
Antigüedad: 16 años
Puntos: 37
Respuesta: Consulta de Join con Zend Framework

Cita:
Iniciado por GatorV Ver Mensaje
Pues sí se puede ver como un hack, yo a mi parecer lo veo como un feature.

No te discuto que debería de tener una integración ya nativa, pero es lo que más me gusta de Zend, el potencial que tiene para poder integregarle, como bien dices Pdo, Zend_Db, Doctrine, etc. no te "obliga" a hacer nada con una set de reglas.

Aunque como bien dices esta desacoplación hacen que sea mas lento el desarrollo inicial (al no tener por ejemplo generadores, scaffolding, etc.) Pero creo que lo vale, y ahora con ZF2, va a ser más sencillo escribir lo necesario, para poder trabajar de forma rápida.

Creo que lo que más me gusta de Zend es la comunidad, muchos desarrolladores brindan componentes, y nada evita que alguien pueda ir y proponer una mejora y compartirla (por ejemplo vía Github, etc.).

Pues yo no discuto el como hacer el join, simplemente le indique a @ApipeMC como hacer lo que quería hacer, sería peor que Zend no te permitiera hacer el join, y te quedarás a parchar el nucleo o algo similar.
Lo de discutir lo del join lo dije por el objetivo de este thread, no por vos. Ese desacople es genial, y es algo de lo que podemos decir ZF lo tiene y el FW que usas vos no :P

Veremos que pasa en esta version nueva, creo que con lo de DI, vamos a ver muchos componententes nuevos.

Como siempre, un placer discuitir contigo.
__________________
blog

Etiquetas: join
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 22:38.