Diferencia entre revisiones de «Como Crear Relacion 1:N KumbiaPHP Framework»

De KumbiaPHP Framework Wiki
 
(No se muestran 57 ediciones intermedias de 16 usuarios)
Línea 1: Línea 1:
Aquí Breve explicación...
+
{{cleanupbox
 +
|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>
 +
}}
  
==Estructura de las Tablas==
+
En este ejemplo se explica como se realizan asociaciones sobre nuestro modelos haciendo uso de las '''Relaciones de ActiveRecord'''.
  
<pre>CREATE TABLE `profesionales` (
+
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.
  `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 '',
 
)ENGINE=InnoDB
 
</pre>
 
  
 +
==Estructura de las Tablas==
  
<pre>CREATE TABLE `especialidades` (
+
<source lang=mysql>
   `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
+
-- -----------------------------------------------------
   `nombre` VARCHAR(45) COLLATE utf8_general_ci NOT NULL DEFAULT '',
+
-- Table `mydb`.`especialidades`
   `profesionales_id` INTEGER(11) NOT NULL,
+
-- -----------------------------------------------------
)ENGINE=InnoDB</pre>
+
CREATE TABLE IF NOT EXISTS `mydb`.`especialidades` (
 +
   `id` INT NOT NULL ,
 +
   `nombre` VARCHAR(45) NULL ,
 +
   PRIMARY KEY (`id`) )
 +
ENGINE = InnoDB;
  
==Descripcion del Modelo==
 
  
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.  
+
-- -----------------------------------------------------
La tabla 'especialidades' hace referencia a las distintas orientaciones dentro la profesion , por ejemplo:<br><br>
+
-- 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;
  
Profesion: Medico    || especialidad: clinico, cardiologo, oftalmologo, etc.<br>
+
</source>
Profesion: Ingeniero || especialidad: civil, sistemas, contrucciones, electronicos, etc.<br><br>
 
  
 
+
==Relación entre los Modelos==
Las tablas  estan creadas en mysql , y estan relacionadas por el campo 'id'.<br><br>
 
  
 
[[Archivo:Relacion.jpg]]
 
[[Archivo:Relacion.jpg]]
Línea 32: Línea 47:
 
==El Modelo==
 
==El Modelo==
  
Con el metodo Belongs_to, se establece una relacion de "pertenece a", es decir de una relacion 1:1(Modelo ER) entre el profesional y la especialidad desarrollada por el mismo.<br>
+
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 Has_many, la relacion es de "tiene muchos", es decir una relacion 1:n(Modelo ER), en el caso del ejemplo una especialidad puede tener (engloba)a varios profesionales.<br>
+
 
 +
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>
 
<source lang=php>
 +
<?php
 
class Profesionales extends ActiveRecord
 
class Profesionales extends ActiveRecord
 
{
 
{
Línea 41: Línea 59:
 
         //Relaciones
 
         //Relaciones
 
         //Un profesional tiene una especialidad
 
         //Un profesional tiene una especialidad
         $this->belongs_to('especialidad');
+
         $this->belongs_to('especialidades');
 
     }
 
     }
 
}
 
}
</source><br><BR>
+
</source>
 +
 
 +
 
 
<source lang=php>
 
<source lang=php>
 +
<?php
 
class Especialidades extends ActiveRecord
 
class Especialidades extends ActiveRecord
 
{
 
{
Línea 57: Línea 78:
 
</source>
 
</source>
  
==La Consulta==
+
==Ejemplo de Uso==
La consulta seria en un controller...<br>
+
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>
 
<source lang=php>
$this->profesionales = $this->Profesionales->find();
+
<td><?php echo $profesional->getEspecialidades()->nombre ?></td>
 
</source>
 
</source>
<br>
+
 
y para obtener la relacion de un profesional obviamente hay que recorrer el array que devolvio el find pero internamente en cada objecto esta la relacion porque asi la definimos 1 profesional tiene una especialidad.<br><br>
+
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>
 
<source lang=php>
foreach ($profesionales as $profesional){
+
<td><?php echo $profesional->getEspecialidades()->getFacultad()->nombreFacultad; ?></td>
echo $profesional->nombre;
+
</source>
        echo $profesional->Especialidades()->nombre;
+
 
 +
 
 +
 
 +
 
 +
=== 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 {
 +
    public function listar()
 +
    {
 +
    $especialidad = new Especialidades();
 +
    $this->especialidades = $especialidad -> find(); //Obtenemos todas las especialidades
 +
   
 +
    }
 
}
 
}
 +
?>
 +
</source>
 +
 +
=== En la Vista correspondiente ===
 +
<source lang=php>
 +
<?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>
 
</source>
 +
 +
=== Screenshot de la vista ===
 +
[[Archivo:Vista2_relacion_1_N_KumbiaPHP.jpg|center|Lista de Especialidades con los Profesionales asociado]]
 +
 +
 +
'''Realizado Por: Adrián Murúa (adolphm)'''
 +
'''Modificado Por: Juan Felipe (JF)'''

Revisión actual del 02:11 18 abr 2015

{{#if:Import.png |}} {{#if: |}}



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 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[editar]

-- -----------------------------------------------------
-- Table `mydb`.`especialidades`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`especialidades` (
  `id` INT NOT NULL ,
  `nombre` VARCHAR(45) NULL ,
  PRIMARY KEY (`id`) )
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;

Relación entre los Modelos[editar]

Relacion.jpg

El Modelo[editar]

Con el método 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 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.

<?php
class Profesionales extends ActiveRecord
{
    public function initialize()
    {
        //Relaciones
        //Un profesional tiene una especialidad
        $this->belongs_to('especialidades');
    }
}


<?php
class Especialidades extends ActiveRecord
{
    public function initialize()
    {
        //Relaciones
        //Un especialidad tiene muchos profesionales
        $this->has_many('profesionales');
    }
}

Ejemplo de Uso[editar]

Suponiendo que necesitamos crear una lista de los profesionales guardados en la tabla profesionales con sus respectivas especialidades.

Listar los Profesionales con su Especialidad[editar]

[ profesionales_controller.php ][editar]

Tenemos que definir en el controlador el arreglo (variable $profesionales) que devuelve la operación en la base de datos.

<?php

Load::models('profesionales');

class ProfesionalesController extends AppController {
    public function listar() 
    {
    	$profesional = new Profesionales();
    	$this->profesionales = $profesional -> find(); //Obtenemos todos los profesionales
    	
    }
}
?>

Obteniendo las Relación de Profesionales[editar]

Para obtener la relación de un profesional obviamente hay que recorrer el array que devolvió el método find() pero internamente en cada objeto está la relación porque así fue definida, Un Profesional tiene una Especialidad.

Vista [ listar.phtml ][editar]

<?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>

¿Pero como se obtienen los datos de la Especialidad?[editar]

Pongamos nuestra atención en esta linea:

<td><?php echo $profesional->getEspecialidades()->nombre ?></td>

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:

<td><?php echo $profesional->getEspecialidades()->getFacultad()->nombreFacultad; ?></td>



Screenshot de la Vista[editar]

Lista de profesionales con su Especialidad

Obteniendo las Relación de Especialidades[editar]

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[editar]

[ profesionales_controller.php ][editar]

Se deben realizar las siguientes modificaciones al controlador.

<?php

Load::models('especialidades');

class ProfesionalesController extends AppController {
    public function listar() 
    {
    	$especialidad = new Especialidades();
    	$this->especialidades = $especialidad -> find(); //Obtenemos todas las especialidades
    	
    }
}
?>

En la Vista correspondiente[editar]

<?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>

Screenshot de la vista[editar]

Lista de Especialidades con los Profesionales asociado


Realizado Por: Adrián Murúa (adolphm) Modificado Por: Juan Felipe (JF)