lunes, 8 de julio de 2013

YII – Mostrar nombre en vez de ID en Foreign Key

En YII Podemos definir en el modelo lo que es llaves foráneas, esta vez, no explicaré mucho el proceso, producto que, si está definido el modelo de la base de datos, Yii lo tomará automáticamente, por ejemplo, si trabajamos con MySQL y motor InnoDB, y creamos todas las relaciones necesarias, para finalmente crear el modelo con GII, podemos ver una función como la siguiente en el modelo.

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(
  'idcliente0' => array(self::BELONGS_TO, 'Cliente', 'idcliente'),
  'idempleados0' => array(self::BELONGS_TO, 'Empleados', 'idempleados'),
  );
}

Está vez, utilizaré un ejemplo de Empleado, Cliente y Atención, en donde en Atención, se guardará la atención que hace el empleado al cliente, por lo cual, está tiene las llaves foráneas de los ID tanto de empleado como cliente.

Como podemos ver, en el modelo, está la función relations(), aquí tenemos un array con elementos, en este caso, los elementos que nombra las relaciones son:

  • idcliente0
  • idempleados0

Estos son los que debemos utilizar en la vista, en este caso, haré un ejemplo de como hacerlo en la vista admin.

En la vista admin, encontraremos lo siguiente:

widget('zii.widgets.grid.CGridView', array(
 'id'=>'atencion-grid',
 'dataProvider'=>$model->search(),
 'filter'=>$model,
 'columns'=>array(
  'idatencion',
  'hora',
  'motivo',
  'comentario',
  'idcliente',
  'idempleados',
  array(
   'class'=>'CButtonColumn',
  ),
 ),
)); 
?>
Por lo cual 'idcliente' y 'idempleados' lo debemos reemplazar y dejar de la siguiente forma:


widget('zii.widgets.grid.CGridView', array(
 'id'=>'atencion-grid',
 'dataProvider'=>$model->search(),
 'filter'=>$model,
 'columns'=>array(
  'idatencion',
  'hora',
  'motivo',
  'comentario',
  array(
   'name'=>'idcliente',
   'value'=>'$data->idcliente0->nombres',
  ),
  array(
   'name'=>'idempleados',
   'value'=>'$data->idempleados0->nombre',
  ),
  array(
   'class'=>'CButtonColumn',
  ),
 ),
)); 
?>;

Como podemos ver, eliminados lo necesario, y agregamos un array, el cual tiene el nombre, y valor. En valor indicamos 

$data->NOMBRE-RELACION->CAMPO-A-MOSTRAR

7 comentarios:

Amigazo, me has salvado la vida! por un trabajo de la universidad, muchas gracias ;)

De nada! esa es la idea :)

Saludos

Bueno amigo llegue hasta aquí y me sacaste de dudas... en todas partes mostraban como hacer eso ... peor aquí es que salí de dudas porque usaste el nombre idcliente0 tal cual esta en el modelo.. en ningún otro lado explicaron eso... gracias!

Si no te ha funcionado intenta cambiar 'name' por 'label'

esto:

array(
'name'=>'idempleados',
'value'=>'$data->idempleados0->nombre',
),

por esto:

array(
'label'=>'idempleados',
'value'=>'$data->idempleados0->nombre',
),

y que pasa si esta mandando el idempleados0 como tabla ???

Casino of the Day | KCMH
At the casino, you 광양 출장안마 can enjoy 군포 출장마사지 a world of fun at the table games, 김제 출장마사지 world class poker, and the latest casino 통영 출장안마 games, 진주 출장마사지 including the Blackjack Tournament!

Publicar un comentario