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.