CakePHP: Foreign key y desplegables - Userlinux.net

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…

CakePHP: Foreign key y desplegables

21.Nov.2007 ~ 6 Comentarios ~ 4598 Lecturas
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    Users
Hablando 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:
CakePHP
Gracias a cakephp-es, -mbavio y AldeaCMS en concreto- he conseguido corregir ese pequeño inconveniente, para ello generamos en controlador una variable ($groupList en este caso) que guarde un array de tuplas id->group para luego rellenar el combo:
$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:
CakePHP
Poco más, un buen tip para despistados como yo. Cada día me gusta más la cocina.

Comentarios


gravatar
22.Nov.2007
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'),
);
}

gravatar
22.Nov.2007
¡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.

gravatar
Manuel
13.Mar.2010
Es muy cierto Joan, sin embargo esa alternativa sirve por si quieres concatenar 2 o mas campos. Saludos

gravatar
29.Jun.2011
Esta es la solución oficial sin ningún tipo de complicación ni parafernalias. Sencillo sencillo:

http://book.cakephp.org/view/1031/Saving-Your-Data#Saving-Related-Model-Data-HABTM-1034

Buen trabajo, de todos modos, a pesar de que ahora haya sido incorporada esta solución.

gravatar
29.Jun.2011
Vaya, puse la solución a HABTM.
La solución para el belongsTo es esta:

http://book.cakephp.org/view/1031/Saving-Your-Data#Saving-Related-Model-Data-hasOne-hasMany-belongsTo-1032

gravatar
04.Aug.2011
yo tengo la duda en que me guarda es el "id" de la tabla especialidades dentro de la tabla proveedores no tengo problema con que guarde sino que no quiero que me guarde el "id" sino lo que me aparece que seria el campo "name" de la tabla especialidades

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • Juan
  • Marina
  • Francisco
  • fon
  • minWi
  • isra
  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

ssh frases champions userlinux iphone lugo rsidenotes felicidades films nintendo opinion sysadmin 2008 blogsfera vacaciones juegos cake ds debian sidenotes apple web blogs mac mysql cakephp deportes 2007 mundial openbsd barça ubuntu twitter blog humor meme canción alemania_2006 games bsd lucux linux twitt programación cumpleaños software django league bash macosx ps3 rfilms conciertos freebsd seguridad personal hack php bake futbol

Archivo

Social

Enlaces de interés