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

De KumbiaPHP Framework Wiki
Línea 138: Línea 138:
 
<source lang=php>
 
<source lang=php>
 
<?php View::content()?>
 
<?php View::content()?>
</source><br>
 
<source lang=html4strict>
 
 
<div align="center">
 
<div align="center">
 
<h5>Lista de Profesionales por Especialidad</h5><br>
 
<h5>Lista de Profesionales por Especialidad</h5><br>
 
<table border="1">
 
<table border="1">
</source><br>
 
<source lang=php>
 
 
<?php foreach ($especialidades as $especialidad) :?>
 
<?php foreach ($especialidades as $especialidad) :?>
 
  <tr><td colspan="2">Especialidad : <h5><?php echo $especialidad->nombre ?></h5><br></td></tr>
 
  <tr><td colspan="2">Especialidad : <h5><?php echo $especialidad->nombre ?></h5><br></td></tr>
</source><br>
 
<source lang=html4strict>
 
 
<tr style="background-color: #c0c0c0;">
 
<tr style="background-color: #c0c0c0;">
 
   <td>Profesional</td>
 
   <td>Profesional</td>
 
   <td>Telefono</td>
 
   <td>Telefono</td>
 
</tr>
 
</tr>
</source><br>
 
<source lang=php>
 
 
<tr>
 
<tr>
 
   <?php foreach ($especialidad->Profesionales() as $profesional) : ?>
 
   <?php foreach ($especialidad->Profesionales() as $profesional) : ?>
Línea 162: Línea 154:
 
<?php  endforeach; ?>
 
<?php  endforeach; ?>
 
<?php endforeach;?>
 
<?php endforeach;?>
</source><br>
 
<source lang=html4strict>
 
 
</table>
 
</table>
 
</div>
 
</div>
 
 
</source>
 
</source>
  
 
=== Screenshot de la vista ===
 
=== Screenshot de la vista ===
 
[[Archivo:vista_listar2.jpg]]
 
[[Archivo:vista_listar2.jpg]]

Revisión del 23:00 27 sep 2009

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

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

Relacion.jpg

El Modelo

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.

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


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

Ejemplo de Uso

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


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 find() pero internamente en cada objecto esta la relación porque así fue definida, Un Profesional tiene una Especialidad.

En el Controller [ProfesionalesController]

...
    public function listar()
    {
        $this->profesionales = $this->Profesionales->find();
    }
...
//los puntos (...) indican que hay una definicion de un controller

Vista [ listar.phtml ]

<?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->Especialidades()->nombre ?></td>
</tr>  
<?php endforeach;?>


</table>
</div><br><br>

Screenshot de la Vista

Vista listar.jpg

Obteniendo las Relación de Especialidades

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.

En el Controller [EspecialidadesController]

...
    public function listar(){
    	$this->especialidades = $this->Especialidades->find("condictions: activo=1");
    }
...
//los puntos (...) indican que hay una definicion de un controller

En la Vista correspondiente

<?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->Profesionales() 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

Vista listar2.jpg