CakePHP: Foreign key y desplegables
21.nov 2007
Envía un trackback
Un tip muy sencillo y funcional para los que quieren rellenar un desplegable con dos tablas relacionadas en CakePHP 1.2. En pocas palabras el entorno es el siguiente, dos tablas Users y Groups relacionadas entre si por el campo Users.group_id (sigo la nomenclatura 'oficial' para que tanto cake como bake me entiendan. Podríamos resumir la relación en:
Users 1:N Groups Users belongsTo Groups Groups hasMany UsersHablando en código -dicho de otra forma- sería este el aspecto de ambos modelos:
class User extends AppModel {
var $name = 'User';
var $belongsTo = array(
'Group' => array('className' => 'Group',
'foreignKey' => 'group_id'),
);
}
class Group extends AppModel {
var $name = 'Group';
var $belongsTo = array(
'Group' => array('className' => 'Group',
'foreignKey' => 'group_id'),
);
}
A la hora de generar las vistas que, por defecto, bake escribe por nosotros me encuentro con un pequeño defecto. Cuando voy a agregar un nuevo usuario, en vez de salir un desplegable con el nombre de los grupos (Groups[id, group, created, modified]), salen los id, para muestra un pantallazo:

$this->set('groupList', $this->User->Group->
generateList(null,null,null,'{n}.Group.id','{n}.Group.group'));
Y ya en la vista (admin_add.ctp) hacemos referencia a dicha variable para rellenar el input del formulario -aquí empieza la magia-:
/* echo $form->input('group_id'); ** Antes */
echo $form->input('group_id', array('options'=>$groupList));
Listo, -aquí acaba la magia-, muestra:

Comentarios
Es mucho más facil, como te has complicado.
Simplemente añade esta linea a cualquier modelo:
var $displayField = 'nombre';
donde nombre es el nombre del campo que quieras que se vea en el desplegable y ya esta.
Asi de facil es cocinar.
Por ejemplo:
class User extends AppModel {
var $name = 'User';
var $displayField = 'nombre'; // o name, titulo, title,...
var $belongsTo = array(
'Group' => array('className' => 'Group',
'foreignKey' => 'group_id'),
);
}
¡Me sonaba un montón esa solución!, pero no acabé de encontrar documentación y no conseguía acordarme de la variable. Es lo malo de CakePHP, la documentación brilla por su ausencia. Mil gracias Joan.
Escribe tu comentario
Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles:
[url=http://direccion]texto[/url], negrita: [b]texto[/b],
itálica: [i]texto[/i], subrayada: [u]texto[/u].
Para mencionar o citar a alguien (quote): [cita]texto[/cita]


