Cgridview Multimodelo

hola buenas quisiera una ayuda con CGridView, necesito realizar un CGridView con 3 modelos relacionados mis tablas son:


Proyecto -> Responsable <-Persona. necesito mostrar la vista admin (CGridView)una columna llamada responsable y que me muestre el nombre del mismo.


  • mi tabla proyecto

cod tipo de dato:serial PK

nombre tipo de dato:text

objetivo tipo de dato:text

meta tipo de dato:text


  • mi tabla responsable

codigo_proyecto FK

cod_resp FK


  • mi tabla persona

codpers tipo de dato: integer PK

nombre tipo de dato: character

aplli tipo de dato: character


LAS RELACIONES DEL MODELO PROYECTO SON

public function relations()

{


return array(


'responsable'=&gt;array(self::HAS_MANY,'Responsable','codigo_proyecto'),





	);


}

LAS RELACIONES DEL MODELO RESPONSABLE

public function relations()

{


	return array(


		'codigoResp' =&gt; array(self::BELONGS_TO, 'Persona', 'codigo_resp'),


		'codigoProyecto' =&gt; array(self::BELONGS_TO, 'Proyecto', 'codigo_proyecto'),


	);


}

LAS RELACIONES DEL MODELO PERSONA

public function relations()


{





return array(





'responsableProyectos' =&gt; array(self::HAS_MANY, 'ResponsableProyecto', 'codigo_resp'),





	);


}

Buenas.

En primer ten en cuenta que tienes una relación HAS_MANY entre proyectos y responsables, por lo q un proyecto podría tener varios responsables.

Para por ejemplo mostrar el primer responsable sería así:

  • Cargas tu CGridView con el modelo proyectos y por ejemplo para mostrar el responsable haces:



'columns'=>array(

array(  

      'name'=>'nombreCampo', 

      'value'=>'$data->responsable[0]->codigoResp->nombre' 

),



Creo q he escrito bien todos los nombres…

Un saludo.

hola muchas gracias excelente respuesta compañero.

al final quedo de esta forma

‘columns’=>array(

array(

  'name'=&gt;'responsable', 


  'value'=&gt;'&#036;data-&gt;responsableProyectos[0]-&gt;codigoResp-&gt;nombre1' 

),

ahora y disculpa la molestia quisiera concatenar el nombre + el apellido como se haria eso ??

Tienes 2 opciones, o lo concatenas en el trozo de código q pusiste o haces lo q para mí sería lo correcto que sería crear una propiedad q se llamase por ejemplo "nombreCompleto" en tu modelo Persona:

Método 1:




'columns'=>array(

array(

'name'=>'responsable',

'value'=>'$data->responsableProyectos[0]->codigoResp->nombre1 . responsableProyectos[0]->codigoResp->aplli'

),



Método 2: (yo lo haría así)




public function getNomeCompleto()

    {

        return $this->aplli. ', ' . $this->nombre1;

    }



Y en tu grid:




'columns'=>array(

array(

'name'=>'responsable',

'value'=>'$data->responsableProyectos[0]->codigoResp->nombreCompleto'

),



Un saludo.

muchas gracias B) :)

hola por una preguntita sabras como mostrar siempre la ultima posicion del arreglo en vez de la primera ??

aqui muestro la primera posicion




'columns'=>array(

array(

'name'=>'responsable',

'value'=>'$data->responsableProyectos[0]->codigoResp->nombre1 . responsableProyectos[0]->codigoResp->aplli'

),



quisiera mostrar a ultima del arreglo…?

Así:




'columns'=>array(

array(

'name'=>'responsable',

'value'=>'$data->responsableProyectos[count($data->responsableProyectos) - 1]->codigoResp->nombre1 . responsableProyectos[0]->codigoResp->aplli'

),



Creo q le hay q restar uno pq el acceso a los elementos es en base 0 y el count en base 1. Compruébalo.

Un saludo.

excelente, tiene mucho sentido lo que has hecho. solicion correcta.! gracias ;)