Ejemplos con dos tablas

El siguiente conjunto de ejemplos usa dos tablas de la base de datos compañía: las tables compañía y departamento. Estos ejemplos ejercitan más la función del DAS Relacional.

En esta serie de ejemplos se crean, se recuperan, se actualizan y finalmente se borran una compañía y un departamento. Esto ilustra el ciclo de vida de un grafo de datos que contiene más de un objeto. Observe que estos ejemplos limpian las tablas compañía y departamento al inicio por lo que se pueden saber los resultados exactos de las consultas.

Se pueden encontrar estos ejemplos combinados en un script llamado 1cd-CRUD en el direcorio Scenarios del paquete del DAS Relacional.

Ejemplo #1 Una compañía, un departamento - Crear

Como en el anterior ejemplo de crear solo un objeto de datos compañía, la primera acción después de construir el DAS Relacional es llamar a createRootDataObject() para obtener el objeto raíz especial del grafo de datos en principio vacío. El objeto compañía se crea entonces como un hijo del objeto raíz, y el objeto departamento como un hijo del objeto compañía.

Cuando se aplican los cambios, el DAS Relacional tiene que llevar a cabo un procesamiento especial para mantener las claves foráneas que soportan las relaciones de contención, especialmente están involucradas claves primarias autogeneradas. En este ejemplo, la relación entre la clave primaria autogenerada id de la tabla compañía y la columna id_comp de la tabla departamento se debe mantener. La primera vez que se inserta una compañía y un departamento, el DAS Relacional tiene que insertar primero la fila de lacompañía, luego llamar al método getLastInsertId() de PDO para obtener la clave primaria autogenerada, y luego añadir tal valor de la columna id_comp al insertar la fila del departamento.

<?php
require_once 'SDO/DAS/Relational.php';
require_once 
'company_metadata.inc.php';

/*************************************************************************************
* Vaciar las dos tablas
*************************************************************************************/
$gbd = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$sentencia_pdo $gbd->prepare('DELETE FROM COMPAÑÍA;');
$filas_afectadas $sentencia_pdo->execute();
$sentencia_pdo $gbd->prepare('DELETE FROM DEPARTAMENTO;');
$filas_afectadas $sentencia_pdo->execute();

/**************************************************************
* Crear una compañía de nombre Acme y un departamento, el departamento de Zapatos
***************************************************************/
$gbd = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$das = new SDO_DAS_Relational ($metadatos_bd,'compañía',$metadatos_contenedor_SDO);

$raíz $das -> createRootDataObject();

$acme $raíz -> createDataObject('compañía');
$acme -> nombre "Acme";

$zapatos $acme->createDataObject('departamento');
$zapatos->nombre 'Zapatos';

$das -> applyChanges($gbd$raíz);

?>

Ejemplo #2 Una compañía, un departamento - Recuperar y actualizar

En este caso, la consulta SQL pasada a executeQuery() realiza una unión interna para unir los datos de las tablas compañía y departamento. Las claves primarias de ambas tablas deben incluirse en la consulta. El conjunto de resultados es renormalizado para formar un grafo de datos normalizado. Observe que se proporciona un especificador de columna como tercer argumento a la llamada a executeQuery(), habilitando al DAS Relacional para conocer cual es cada columna en el conjunto de resultados.

Observe que, aunque la columna id_comp se usa en la consulta, no es necesaria en el conjunto de resultados. Para poder comprender lo que el DAS Relacional hace cuando construye el grafo de datos, puede ser de ayuda visualizar a lo que se asemeja el conjunto de resultados. Aunque los datos de la base de datos estén normalizados, por los que varias filas de departamentos puedan apuntar a través de sus claves foráneas a una fila de compañía, los datos del conjunto de resultados no están normalizados, esto es, si existe una compañía y múltiples departamentos, los valores de la compañía se repiten en cada fila. El DAS Relacional tiene que invertir este proceso y volver a convertir el conjunto de resultados en un grafo de datos normalizado, con sólo un objeto compañía.

En este ejemplo el DAS Relacional examinará el conjunto de resultados y el especificador de columna, buscará datos para las tablas compañía y departamento, buscará claves primarias para ambas tablas, e interpretará cada fila como contenedora de datos de un departamento y su compañía madre. Si no encontró datos para esa compañía antes (usa la clave primaria para comprobarlo), crea un objeto compañía y luego un objeto departamento bajo él. Si ya encontró datos para esa compañía antes y ya creó el objeto compañía, entonces creará el objeto departamento bajo ella.

De esta forma, el DAS Relacional puede recuperar y renormalizar datos para múltiples compañías y múltiples departamentos bajo ellas.

<?php
require_once 'SDO/DAS/Relational.php';
require_once 
'company_metadata.inc.php';

/**************************************************************
* Recuperar la compañía y el departamento Zapatos, luego borrar Zapatos y añadir TI
***************************************************************/
$gbd = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$das = new SDO_DAS_Relational ($metadatos_bd,'compañía',$metadatos_contenedor_SDO);

$raíz $das->executeQuery($gbd,
'select c.id, c.nombre, d.id, d.nombre from compañía c, departamento d where d.id_comp = c.id',
array(
'compañía.id','compañía.nombre','departamento.id','departamento.nombre'));

$acme $raíz['compañía'][0];            // obtener la primera compañía - será 'Acme'
$zapatos $acme['departamento'][0];     // obtener el primer departamento bajo ella - será 'Zapatos'

unset($acme['departamento'][0]);

$ti $acme->createDataObject('departamento');
$ti->nombre 'TI';

$das -> applyChanges($gbd$raíz);
?>

Ejemplo #3 Una compañía, dos departamentos - Recuperar y eliminar

En este ejemplo la compañía y el departamento son recuperados y luego eliminados. No es necesario eliminarlos individualmente (aunque sería posible) - al eliminar el objeto compañía del grafo de datos también se elimina cualquier departamento bajo él.

Observe la manera en que el objeto compañía es eliminado realmente usando la llamada a unset de PHP. unset se ha de realizar sobre la propiedad de contención que, en este caso, es la propiedad compañía del objeto raíz especial. Se debe usar:

<?php
unset($raíz['compañía'][0]);
?>
y no:
<?php
unset($acme); //ERRÓNEO
?>
Al usar unset con $acme destruiría la variable, pero dejaría los daos del grafo de datos intactos.

<?php
require_once 'SDO/DAS/Relational.php';
require_once 
'company_metadata.inc.php';

/**************************************************************
* Recuperar la compañía y el departamento TI, luego borrar la compañía completa
***************************************************************/
$gbd = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$das = new SDO_DAS_Relational ($metadatos_bd,'compañía',$metadatos_contenedor_SDO);

$raíz $das->executeQuery($gbd,
'select c.id, c.nombre, d.id, d.nombre from compañía c, departamento d where d.id_comp = c.id',
array(
'compañía.id','compañía.nombre','departamento.id','departamento.nombre'));

$acme $raíz['compañía'][0];
$ti $acme['departamento'][0];

unset(
$raíz['compañía'][0]);

$das -> applyChanges($gbd$raíz);

?>