Revisión actual |
Tu texto |
Línea 1: |
Línea 1: |
− | {{cleanupbox
| + | Aquí Breve explicación... |
− | |image=[[Archivo:Import.png|40px]]
| |
− | |texto ='''Este Artículo esta siendo revisado por los Kumbieros.'''<br />
| |
− | <span style="font-size:90%">El ejemplo presente es completamente funcional, pero su redacción debe mejorar</span>
| |
− | }}
| |
− | | |
− | En este ejemplo se explica como se realizan asociaciones sobre nuestro modelos haciendo uso de las '''Relaciones de ActiveRecord'''.
| |
− | | |
− | Tenemos dos tablas (especialidades y profesionales) entre las cuales existe una relación de 1:N (1 a muchos), es decir un profesional tiene una especialidad (para efecto del ejemplo) y una especialidad tiene muchos profesionales, la idea de las relaciones en [http://www.kumbiaphp.com KumbiaPHP] es que cuando se realice una búsqueda de profesionales implícitamente este su relación, en este caso seria su especialidad (un objeto) y cuando se realice una búsqueda por especialidad obtener los profesionales (array de objectos) asociados a esta.
| |
| | | |
| ==Estructura de las Tablas== | | ==Estructura de las Tablas== |
| + | CREATE TABLE `profesionales` ( |
| + | `id` INTEGER(11) NOT NULL AUTO_INCREMENT, |
| + | `apellido` VARCHAR(45) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', |
| + | `nombre` VARCHAR(45) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', |
| + | `documento` VARCHAR(11) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `cuit` VARCHAR(11) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `matricula` VARCHAR(11) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `direccion` VARCHAR(60) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `telefono_1` VARCHAR(20) COLLATE utf8_spanish_ci NOT NULL DEFAULT '', |
| + | `telefono_2` VARCHAR(20) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `telefono_3` VARCHAR(20) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `movil` VARCHAR(20) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `email_1` VARCHAR(100) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `email_2` VARCHAR(100) COLLATE utf8_spanish_ci DEFAULT NULL, |
| + | `especialidades_id` INTEGER(11) NOT NULL, |
| + | `activo` INTEGER(11) NOT NULL DEFAULT '0', |
| + | PRIMARY KEY (`id`), |
| + | UNIQUE KEY `id` (`id`), |
| + | KEY `fk_profesionales_Especialidades1` (`Especialidades_id`), |
| + | CONSTRAINT `especialidades_id` FOREIGN KEY (`Especialidades_id`) REFERENCES `especialidades` (`id`) |
| + | )ENGINE=InnoDB |
| | | |
− | <source lang=mysql>
| + | CREATE TABLE `especialidades` ( |
− | -- -----------------------------------------------------
| + | `id` INTEGER(11) NOT NULL AUTO_INCREMENT, |
− | -- Table `mydb`.`especialidades`
| + | `nombre` VARCHAR(45) COLLATE utf8_general_ci NOT NULL DEFAULT '', |
− | -- -----------------------------------------------------
| + | `activo` INTEGER(11) DEFAULT NULL, |
− | CREATE TABLE IF NOT EXISTS `mydb`.`especialidades` ( | + | PRIMARY KEY (`id`), |
− | `id` INT NOT NULL , | + | UNIQUE KEY `id` (`id`) |
− | `nombre` VARCHAR(45) NULL ,
| + | )ENGINE=InnoDB |
− | PRIMARY KEY (`id`) )
| + | ==Descripcion del Modelo== |
− | ENGINE = InnoDB;
| |
− | | |
− | | |
− | -- -----------------------------------------------------
| |
− | -- Table `mydb`.`profesionales`
| |
− | -- -----------------------------------------------------
| |
− | CREATE TABLE IF NOT EXISTS `mydb`.`profesionales` (
| |
− | `id` INT NOT NULL AUTO_INCREMENT ,
| |
− | `nombre` VARCHAR(45) NULL , | |
− | `apellido` VARCHAR(45) NULL , | |
− | `especialidades_id` INT NOT NULL ,
| |
− | PRIMARY KEY (`id`) , | |
− | INDEX `fk_profesionales_especialidades` (`especialidades_id` ASC) , | |
− | CONSTRAINT `fk_profesionales_especialidades`
| |
− | FOREIGN KEY (`especialidades_id` )
| |
− | REFERENCES `mydb`.`especialidades` (`id` )
| |
− | ON DELETE NO ACTION
| |
− | ON UPDATE NO ACTION)
| |
− | ENGINE = InnoDB; | |
− | | |
− | </source>
| |
− | | |
− | ==Relación entre los Modelos== | |
− | | |
− | [[Archivo:Relacion.jpg]]
| |
− | | |
− | ==El Modelo==
| |
− | | |
− | Con el método [[Asociaciones#Pertenece_.28belongs_to.29 | belongs_to()]], se establece una relación de '''pertenece a''', es decir de una relación 1:1 (Modelo ER) entre el profesional y la especialidad desarrollada por el mismo.
| |
− | | |
− | Por otra parte con [[Asociaciones#Tiene_muchos_.28has_many.29 | has_many()]], se establece una relación es de '''tiene muchos''', es decir una relación 1:N (Modelo ER), en el caso del ejemplo una especialidad puede tener (engloba) a varios profesionales.
| |
− | | |
− | <source lang=php>
| |
− | <?php
| |
− | class Profesionales extends ActiveRecord
| |
− | {
| |
− | public function initialize()
| |
− | {
| |
− | //Relaciones
| |
− | //Un profesional tiene una especialidad
| |
− | $this->belongs_to('especialidades');
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | | |
− | <source lang=php>
| |
− | <?php
| |
− | class Especialidades extends ActiveRecord
| |
− | {
| |
− | public function initialize()
| |
− | {
| |
− | //Relaciones
| |
− | //Un especialidad tiene muchos profesionales
| |
− | $this->has_many('profesionales');
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | ==Ejemplo de Uso==
| |
− | Suponiendo que necesitamos crear una lista de los profesionales guardados en la tabla profesionales con sus respectivas especialidades.
| |
− | | |
− | == Listar los Profesionales con su Especialidad ==
| |
− | | |
− | ===[ profesionales_controller.php ] ===
| |
− | | |
− | Tenemos que definir en el controlador el arreglo (variable $profesionales) que devuelve la operación en la base de datos.
| |
− | | |
− | <source lang=php>
| |
− | <?php
| |
− | | |
− | Load::models('profesionales');
| |
− | | |
− | class ProfesionalesController extends AppController {
| |
− | public function listar()
| |
− | {
| |
− | $profesional = new Profesionales();
| |
− | $this->profesionales = $profesional -> find(); //Obtenemos todos los profesionales
| |
− |
| |
− | }
| |
− | }
| |
− | ?>
| |
− | </source>
| |
− | | |
− | === Obteniendo las Relación de Profesionales ===
| |
− | Para obtener la relación de un profesional obviamente hay que recorrer el array que devolvió el método [[Consultas#find | find()]] pero internamente en cada objeto está la relación porque así fue definida, Un Profesional tiene una Especialidad.
| |
− | | |
− | === Vista [ listar.phtml ] ===
| |
− | | |
− | <source lang=php>
| |
− | <?php View::content()?>
| |
− | <br><br>
| |
− | <div align="center">
| |
− | <h5>Lista de Profesionales</h5><br>
| |
− | <table border="1">
| |
− | <tr style="background-color: #c0c0c0;">
| |
− | <td>Profesional</td>
| |
− | <td>Especialidad</td>
| |
− | </tr>
| |
− | <?php foreach ($profesionales as $profesional) :?>
| |
− | <tr>
| |
− | <td><?php echo $profesional->apellido . ", " . $profesional->nombre ?></td>
| |
− | <td><?php echo $profesional->getEspecialidades()->nombre ?></td>
| |
− | </tr>
| |
− | <?php endforeach;?>
| |
− | </table>
| |
− | </div><br><br>
| |
− | </source>
| |
− | | |
− | === ¿Pero como se obtienen los datos de la Especialidad? ===
| |
− | | |
− | Pongamos nuestra atención en esta linea:
| |
− | <source lang=php>
| |
− | <td><?php echo $profesional->getEspecialidades()->nombre ?></td>
| |
− | </source>
| |
− | | |
− | De esta forma KumbiaPHP nos hace la conexión entre las dos tablas, solo tenemos que especificar getNombreDelModelo()->campo;
| |
− | | |
− | Si por ejemplo tuviéramos una relación adicional entre una tabla Facultades y la tabla Especialidades, podríamos obtener la facultad de cada profesional mediante:
| |
− | <source lang=php>
| |
− | <td><?php echo $profesional->getEspecialidades()->getFacultad()->nombreFacultad; ?></td>
| |
− | </source>
| |
− | | |
− | | |
− | | |
− | | |
− | === Screenshot de la Vista ===
| |
− | [[Archivo:Vista1_relacion_1_N_KumbiaPHP.jpg|center|Lista de profesionales con su Especialidad]]
| |
− | | |
− | === Obteniendo las Relación de Especialidades ===
| |
− | | |
− | [[Categoría:Tutoriales KumbiaPHP]]
| |
− | Para obtener la relación de las Especialidades, se debe obtener la lista de especialidades y luego, por cada una de las especialidades, agrupar los profesionales que tienen esa especialidad.
| |
− | | |
− | === Controlador para listar Profesionales por Especialidad ===
| |
− | | |
− | ===[ profesionales_controller.php ] ===
| |
− | | |
− | Se deben realizar las siguientes modificaciones al controlador.
| |
− | | |
− | <source lang=php>
| |
− | <?php
| |
− | | |
− | Load::models('especialidades');
| |
| | | |
− | class ProfesionalesController extends AppController {
| + | El mnodelo esta compuesto por dos tablas: Profesionales y Especialidades, la tabla 'profesionales' esta diseñada para llevara los datos de todos los profesionales de una empresa interdisciplinaria, estos profesionales pueden ser: medicos, abogados, ingenieros, etc. |
− | public function listar()
| + | La tabla 'especialidades' hace referencia a las distintas orientaciones dentro la profesion , por ejemplo:<br><br> |
− | {
| |
− | $especialidad = new Especialidades();
| |
− | $this->especialidades = $especialidad -> find(); //Obtenemos todas las especialidades
| |
− |
| |
− | }
| |
− | }
| |
− | ?>
| |
− | </source> | |
| | | |
− | === En la Vista correspondiente ===
| + | Profesion: Medico || especialidad: clinico, cardiologo, oftalmologo, etc.<br> |
− | <source lang=php>
| + | Profesion: Ingeniero || civil, sistemas, contrucciones, electronicos, etc.<br><br> |
− | <?php View::content()?>
| |
− | <div align="center">
| |
− | <h5>Lista de Profesionales por Especialidad</h5><br>
| |
− | <table border="1">
| |
− | <?php foreach ($especialidades as $especialidad) :?>
| |
− | <tr><td colspan="2">Especialidad : <h5><?php echo $especialidad->nombre ?></h5><br></td></tr>
| |
− | <tr style="background-color: #c0c0c0;">
| |
− | <td>Profesional</td>
| |
− | <td>Telefono</td>
| |
− | </tr>
| |
− | <tr>
| |
− | <?php foreach ($especialidad->getProfesionales() as $profesional) : ?>
| |
− | <td><?php echo $profesional->apellido .", ".$profesional->nombre ?></td>
| |
− | <td><?php echo $profesional->telefono1 ?></td>
| |
− | </tr>
| |
− | <?php endforeach; ?>
| |
− | <?php endforeach;?>
| |
− | </table>
| |
− | </div>
| |
− | </source>
| |
| | | |
− | === Screenshot de la vista ===
| |
− | [[Archivo:Vista2_relacion_1_N_KumbiaPHP.jpg|center|Lista de Especialidades con los Profesionales asociado]]
| |
| | | |
| + | Las tablas estan creadas en mysql , y estan relacionadas por el campo 'id' de la tabla especialidades.<br><br> |
| | | |
− | '''Realizado Por: Adrián Murúa (adolphm)'''
| + | [[Archivo:Relacion_tablas.png]] |
− | '''Modificado Por: Juan Felipe (JF)'''
| |