Recuperar datos de una consulta con multiples JOINS

Hola,

Mi pregunta es ¿como puedo saber la estructura de los datos cuyo resultado viene de una consulta con diferentes JOINs?

Lo digo porque en diferentes consultas con varios JOINs la recogida de datos es diferente. He usado el var_dump de PHP para ver el contenido del objeto que se trae la consulta y como no recorre todos los objetos hijos no veo el contenido total.

Os pongo varios ejemplos usando también relaciones:


        $entidades=Entidades::model()->with(array('relaciones.codigos','relaciones.anhos','localizaciones'))->together()->findAll($criteria);


        $i=0;


        foreach($entidades as $n=>$entidad) {

            foreach($entidad->relaciones as $n2=>$relacion) {

                foreach($entidad->localizaciones as $n3=>$localizacion) {

                    $responce->rows[$i]['id']=CHtml::encode($entidad->id);

                    $responce->rows[$i]['cell']=array(

                        CHtml::encode($entidad->id),

                        CHtml::encode($entidad->nombre),

                        CHtml::encode($entidad->id_municipio),

                        CHtml::encode($entidad->baja_logica),

                        CHtml::encode($localizacion->superficie),

                        CHtml::encode($localizacion->altitud),

                        CHtml::encode($localizacion->utm_x),

                        CHtml::encode($localizacion->utm_y),

                        CHtml::encode($localizacion->huso),

                        CHtml::encode($localizacion->hoja),

                        CHtml::encode($localizacion->longitud_grados),

                        CHtml::encode($localizacion->longitud_minutos),

                        CHtml::encode($localizacion->longitud_segundos),

                        CHtml::encode($localizacion->latitud_grados),

                        CHtml::encode($localizacion->latitud_minutos),

                        CHtml::encode($localizacion->latitud_segundos),

                        CHtml::encode($relacion->anhos->anho),

                        CHtml::encode($relacion->codigos->codigo_ine)

                    );

                    $i++;

                }

            }



Esta me funciona bien y son 3 foreach para poder sacar los datos que necesito.




        $ayuntamientos=Ayuntamientos::model()->with(array('municipios','municipios.provincias','municipios.relaciones.codigos','municipios.relaciones.anhos'))->together()->findAll($criteria);




        $i=0;


        foreach($ayuntamientos as $n=>$ayuntamiento) {

                foreach($ayuntamiento->municipios->relaciones as $n2=>$relaciones) {

                    $responce->rows[$i]['id']=CHtml::encode($ayuntamiento->id);

                    $responce->rows[$i]['cell']=array(CHtml::encode($ayuntamiento->id),

                        CHtml::encode($ayuntamiento->municipios->provincias->nombre),

                        CHtml::encode($ayuntamiento->municipios->provincias->codigo_ine),

                        CHtml::encode($ayuntamiento->municipios->nombre),

                        CHtml::encode($relaciones->codigos->codigo_ine),

                        CHtml::encode($ayuntamiento->cif)

                    );

                    $i++;


                }


        }



Esta también me funciona y va bien.


      $centros=CentrosEmisores::model()->with(array('entidades','entidades.municipios','titulares'))->together()->findAll($criteria);



Con esta última no soy capaz de sacar los datos de la tabla titulares relacionada.

Si pongo el siguiente código me da error que $centro->titulares no es un argumento válido para el foreach (Invalid argument supplied for foreach())




        foreach($centros as $n=>$centro) {

                foreach($centro->titulares as $n3=>$titular) {

                    $responce->rows[$i]['id']=CHtml::encode($centro->id);

                    $responce->rows[$i]['cell']=array(

                        CHtml::encode($centro->id),

                        CHtml::encode($centro->codigo_sr),

                        CHtml::encode($centro->entidades->nombre),

                        CHtml::encode($centro->entidades->municipios->nombre),

                        CHtml::encode($centro->denominacion),

                        CHtml::encode($titular->nombre)

                        );

                        $i++;

                }


        }



Y si intento ir por la relación directamente me dice que no existe la propiedad u objeto de $centro->titulares->nombre ,

<h3>Descripción</h3>

<p class="message">

Trying to get property of non-object</p>

:




        foreach($centros as $n=>$centro) {

                    $responce->rows[$i]['id']=CHtml::encode($centro->id);

                    $responce->rows[$i]['cell']=array(

                        CHtml::encode($centro->id),

                        CHtml::encode($centro->codigo_sr),

                        CHtml::encode($centro->entidades->nombre),

                        CHtml::encode($centro->entidades->municipios->nombre),

                        CHtml::encode($centro->denominacion),

                        CHtml::encode($centro->titulares->nombre)

                        );

                        $i++;


        }



¿Sabéis alguna norma para poder rápidamente sacar los datos de una consulta y saber cuando ir a la relación directamente o hacer u foreach adicional? O alguna clase que me haga el dump de todos los objeto y así saber rápidamente como recorrer los objetos para usar el dato necesario.

Pongo también las relaciones asociadas en el model:




	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'entidades' => array(self::BELONGS_TO, 'Entidades', 'id_entidad', 'alias'=>'entidades'),

			'origenes' => array(self::BELONGS_TO, 'OrigenesCentro', 'id_origen', 'alias'=>'origenes'),

			'titulares' => array(self::BELONGS_TO, 'Titulares', 'id_titular', 'alias'=>'titulares'),

			'analogicos' => array(self::MANY_MANY, 'CanalesAnalogicos', 'rel_centros_canales_analogicos(id_centro, id_canal)', 'alias'=>'analogicos'),

			'multiplex' => array(self::MANY_MANY, 'Multiplex', 'rel_centros_emisores_multiplex(id_centro, id_multiplex)', 'alias'=>'multiplex'),

			'servicios' => array(self::MANY_MANY, 'Servicios', 'rel_centros_servicios(id_centro, id_servicio)', 'alias'=>'servicios'),

		);

	}



La consulta la hace correctamente ya que la veo en las trazas.

Saludos y gracias por adelantado.

hola

creo que "titulares" no retorna datos, por eso el error, es una relacion opcional? o es obligatoria

intenta chequear si $centro->titulareses nulo o un arreglo vacio antes de hacer el foreach para este tipo de relaciones(opcionales)




              foreach($centros as $n=>$centro) 

                print_r($centro->titulares);

                if ($centro->titulares!=null)

                {

                foreach($centro->titulares as $n3=>$titular) {

                    $responce->rows[$i]['id']=CHtml::encode($centro->id);

                    $responce->rows[$i]['cell']=array(

                        CHtml::encode($centro->id),

                        CHtml::encode($centro->codigo_sr),

                        CHtml::encode($centro->entidades->nombre),

                        CHtml::encode($centro->entidades->municipios->nombre),

                        CHtml::encode($centro->denominacion),

                        CHtml::encode($titular->nombre)

                        );

                        $i++;

                }


        }



saludos!

Como siempre, era eso.

Muchas gracias, de todas formas no entiendo porque en algunos sitios tengo que realizar el foreach hacia una tabla relacionada y en otras situaciones con recorrer de una tabla origen a otra tabla destino a través de la relaciones funciona.

¿Es por el tipo de relación? (si es BELONG_TO o HAS_MANY)?

Saludos.

mejor asi!

HAS_MANY: en tu sitio $centro->titulares

BELONG_TO. en tu sitio, municipios->provincias

si, es por eso

Gracias por la aclaración.

Saludos.