Extraer datos de una tabla Extraer datos multiples usando auxiliars

Extraer datos de multiples tablas


En este ejercicio crearemos un objeto mas complejo, con relaciones asociadas a él, la idea es sacar un jefe y asignarle a este jefe la lista de personas a su mando.

Lo primero que debemos hacer es crear 3 personas y asignarlas al jefe con el documento 1 de la siguiente manera:

Documento: 101
Nombre: Roger
Apellido: Alvarez
Edad: 20
Jefe: 1

Documento: 102
Nombre: Andres
Apellido: Sossa
Edad: 17
Jefe: 1

Documento: 103
Nombre: Cristhian
Apellido: Garzon
Edad: 22
Jefe: 1

Igualmente crearemos una persona y se la asignaremos al jefe con documento 2:

Documento: 104
Nombre: Carlos
Apellido: Vivares
Edad: 37
Jefe: 2

Con los datos anteriores creados, procederemos a crear el controlador y el template para este ejercicio, del siguiente modo:
1) Creamos el controlador example_orm_read_multiple.php en la ruta: work/example_orm_read_multiple.php con la siguiente información:

<?php

require('./configs/include.php');

class 
c_example_orm_read_multiple extends super_controller {

    public function 
display()
    {
        
$cod['boss']['document']=1;
        
$cod['boss']['attributes']=array("document");
        
$options['boss']['lvl2']="by_attributes";
        
        
$cod['person']['boss']=1;
        
$cod['person']['attributes']=array("boss");
        
$options['person']['lvl2']="by_attributes";
        
        
$components['boss']['person']=array("b_p");
        
        
$this->orm->connect();
        
$this->orm->read_data(array("boss","person"),$options,$cod);
        
$boss $this->orm->get_objects("boss",$components);
        
$this->orm->close();
        
$this->engine->assign('boss',$boss[0]);
        
        
$this->engine->assign('title','Example Orm Read Multiple');
        
$this->engine->display('header.tpl');
        
$this->engine->display('example_orm_read_multiple.tpl');
        
$this->engine->display('footer.tpl');
    }
    
    public function 
run()
    {
        
$this->display();
    }
}

$call = new c_example_orm_read_multiple();
$call->run();

?>

Explicación del controlador example_orm_read_multiple.php:
Antes de dar una explicación detallada debemos resaltar ciertos aspectos:
  • Este ejercicio se trata de extraer el jefe con documento 1, y la lista de personas a su cargo (se eligió este documento al azar pero podría ser con cualquier otro).
  • En el ejemplo anterior usamos el case "all" para extraer datos de la base de datos de 'boss', en este caso usaremos el case "by_attributes" (normalmente cuando se usa el CRUD en el gestor en la parte del SELECT se crean 3 casos por defecto: - 'all' visto anteriormente que saca todos los resultados de una tabla - 'by_attributes' visto en este ejemplo que saca resultados en base a uno o varios atributos - 'by_pages' usado desde el panel de admin para ir mostrando todos los resultados por páginas).

Case by_attributes:
Para que este case funcione se debe enviar: $options["nombre_de_la_clase"]["lvl2"] = "by_attributes"
Y además se deben enviar códigos con la lista de atributos por los cuales se quiere hacer el SELECT y los códigos de los atributos del siguiente modo:

Supongamos que queremos hacer una búsqueda de las personas que se llamen juan y tengan 15 años, crearíamos los cods y el options así:
- $options["person"]["option"]="by_attributes";
- $cod["person"]["attributes"]=array("name","age");
- $cod["person"]["name"]="juan";
- $cod["person"]["age"]=15;

En base a este ejemplo anterior, podemos entender fácilmente las primeras 6 lineas de la función display del ejemplo actual.

Funcion read_data: $this->orm->read_data(array("boss","person"),$options,$cod);
Recordemos que esta función recibe 3 parámetros:
- par1 (nombres de las clases o tablas que se desean leer): en el ejemplo anterior solo deseábamos hacer una lectura de boss, pero en este ejemplo debemos hacer 2 lecturas una de boss para sacar la info del jefe con documento 1, y otra de person para sacar la info de todas las personas que tiene como jefe aquel con documento 1
- par2 ($options): enviamos los options diciendo que ambos casos tanto como para boss como para person se desea hacer una lectura nivel 2 por attributos, en el caso de boss esta lectura es en base a su documento donde sea igual a 1; en el caso de person es en base al attributo boss donde este sea igual a 1.
- par3 ($cod): se envían los codigos de document y boss respectivamente para las clases 'boss' y 'person'

Funcion get_objetcs: $boss = $this->orm->get_objects("boss",$components);
Recordemos que esta función retorna objetos de la clase indicada por par1 y cuenta con 3 parametros:
- par1: nombre de la clase que se desea retorna en forma objetual (en este caso 'boss' ya que deseamos retornar un jefe con sus personas a cargo asignadas por dentro - pero también podría ser al contrario retornar las personas y a cada persona asignarle por dentro los datos de su jefe).
- par2 ($components) $components["boss"]["person"]=array("b_p");:
Debe completarse de la siguiente manera: $components["valor_de_par1"]["nombre_de_la_clase_que_se_desea_agisnar"] = array('lista_de_las_relaciones_entre_las_clases')
De este modo en el ejemplo actual estamos indicando que a la clase boss le queremos asignar elementos de la clase person, y que para poder asignar estos elementos se debe hacer una verificar de la relación b_p (esta relación se creo y se explico anteriormente en tutoriales de la capa clases).
- par3 ($auxiliars): será visto en tutoriales posteriores.

De esta manera ya tenemos una lista de jefes con sus personas a cargo asignadas, como en este ejemplo sabemos que solo existe un jefe con documento 1, entonces simplemente asignamos el jefe de la primera posición (posición cero) $this->engine->assign('boss',$boss[0]);

2) Creamos el template example_orm_read_multiple.tpl en la ruta: work/templates/t_dark/example_orm_read_multiple.tpl con la siguiente información y con simple section de smarty:

<div class="square">
<table border="0" width="100%" cellpadding="0" cellspacing="10">
<tr><td><b>Personas a Cargo del jefe: {$boss->get('name')} - con documento: {$boss->get('document')}</b></td></tr>
{section loop=$boss->components["person"]["b_p"] name=i}
<tr><td><b>Documento:</b> {$boss->components["person"]["b_p"][i]->get('document')}<br />
<b>Nombre:</b> {$boss->components["person"]["b_p"][i]->get('name')}<br />
<b>Apellido:</b> {$boss->components["person"]["b_p"][i]->get('lastname')}<br />
<b>Edad:</b> {$boss->components["person"]["b_p"][i]->get('age')}
</td></tr>
{/section}
</table>
</div>

Finalmente ingresamos desde el navegador a la ruta: work/example_orm_read_multiple.php y debe salir algo como esto:

example10.png
Extraer datos de una tabla Extraer datos multiples usando auxiliars