Tablas relacionadas en cakephp y Recuperar datos de ellas. Escucha este post

1 comentarios

 Definir relaciones entre Modelos (tablas)

Para ver este tema empezaremos a partir de una aplicación
Scaffolding puedes ver el tema aqui.

Como cualquiera que tenga experiencia en bases de datos
sabrá hay 3 tipos de relaciones  que una tabla puede tener.

1.    
Uno a uno: Un registro guarda relación con un registro de otra tabla.

2.    
Uno a muchos: un registro guarda relación con  muchos
registros de otra tabla.

3.    
Muchos a muchos: Muchos registros guardan relación con muchos registros
de otra tabla.

Para definir estas relaciones
en los modelos tenemos estas dos variables

var $belongsTo=’modeloQSigue’;

Esta variable se pone cuando sigue a un modelo

var $hasOne=’modeloQLoSiguen’;

Esta variable se pone cuando lo sigue otro modelo

var $hasMany=’modelosQLoSiguen’;

Esta variable se pone cuando lo siguen otros modelos

var $hasAndBelongsToMany  =’modeloQLoSiguen’;

Esta variable se pone cuando tiene y pertenece a muchos



Para este ejemplo haremos un ejemplo de alumnos con cursos. Donde a un
curso tiene muchos alumnos, Y un alumno solo tiene un curso.

Creamos la base de datos con
las siguientes tablas:




CREATE TABLE `cursos` (

`id` int( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,

`nombre` varchar( 127 ) NOT NULL ,

`aula` varchar( 127 ) NOT NULL ,

`tutor` varchar( 127 ) NOT NULL

);



CREATE TABLE `alumnos` (

`id` int( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,

`codigo` varchar( 13 ) NOT NULL ,

`nombre` varchar( 64 ) NOT NULL ,

`apellidos` varchar( 127 ) NOT NULL ,

`curso_id` int( 11 ) NOT NULL


)



Nota que en  la table alumnos hemos creado un campo curso_id que es una clave
externa para relacionarla con la table cursos. las relaciones  que tienen estos
modelos entre si.las reglas para las claves externas son

1.       Nombre
en singular del modelo que sigue

2.       Seguido
de _id




<?php

class Alumno extends AppModel{

var $name='Alumno';

var $belongsTo='Curso';// pértenece a : Curso

}

?>

Se nota que en el modelo Alumno
hemos puesto la variable $belongsTo por que esigue a un modole en este caso a
curso

<?php

class Curso extends AppModel{

var $name='Curso';

var $hasMany='Alumno';//tiene muchos 

}

?>



Y en Curso hemos puesto la
variable $hasMany por que un curso puede tener muchos Alumnos (en este caso).Y
así de fácil hemos definido la relación que guardan estos dos modelos



Una ves hecho las tablas vamos a crear los modelos y definir.






Ya tenemos definidos los
modelos y la relación que guardan entre ellos  pero no podemos definir nada
sin  los controladores ni las vistas. Para ver esto mas rápido tenemos la
variable Scaffolding. Con esta variable podemos probar estas relaciones. Las
definimos en los dos controladores.



class CursosController extends AppController{

   var $name=  'Cursos';

   Var $sacaffold;

}



class
AlumnosController extends AppController{

   var $name=  'Alumnos';

   Var $sacaffold;

}

Ya con estos controladores
podemos esa relación. Puedes llenar algunos cursos primero para poder ver como
desde la creación de un  nuevo alumno puedes escoger el id del Curso al que
pertenecerá.

 



Recuperar Datos de tablas
relacionadas

Una ves hecho un ligero trabajo
susio cakephp nos da la grata noticia  que para poder recuperar datos de tablas
relacionadas no necesitamos hacer nada. El mismo método find(‘all’)
nos devuelve también los registros relacionados con el registro solicitado en
la búsqueda.Whore!!



Solo tenemos que tener en cuenta que si queremos sacar registros de otros
modelos relacionados indirectamente usamos una propiedad del modelo llamado
$this->Model->recursive=1 que es el valor por defecto;



La forma que nos devolverá los registros relacionados dependerá la variable que
ayamos definido en el modelo ya sea $hasMany o $belongsTo