Los siguientes ejemplos usan tres tablas de la base de datos compañía: las tablas compañía, departamento y empleado. Estas introducen la pieza final de la función no ejercitada por los ejemplo anteriores: la referencia de no contención empleado_del_mes.
Al igual que en los ejemplo de arraiba para la compañía y el departamento, este conjunto de ejemplos intentan ilustrar el ciclo de vida completo de un grafo de datos.
Ejemplo #1 Una compañía, un departamento, un empleado - Crear
En este ejemplo se crea una compañía que contiene un departamento y sólo un empleado. Observe que este ejemplo limpia las tres tablas al inicio, por lo que se conocerán los resultados exactos de las consultas.
Observe cómo una vez ha sido creados la compañía, el departamento y el empleado, se puede hacer que la propiedad empleado_del_mes de la compañía apunte al nuevo empleado. Ya que esta propiedad es una referencia de no contención, no puede hacerse hasta que el objeto empleado haya sido creado dentro del grafo. Las referencias de no contención necesitan ser manejadas cuidadosamente. Por ejemplo, si el empleado ahora fuera eliminado del departamento al que pertenece, no sería correcto intentar guardar el grafo sin primero limpiar o reasignar la propiedad empleado_del_mes . La regla de cierre de los grafos de datos de SDO requiere que cualquier objeto que sea apuntado por una referencia de no contención también debe ser alcanzable por relaciones de contención.
Cuando se va a insertar el grafo en la base de datos, el procedimiento es similar al ejemplo de insertar la compañía y el departamento, excepto que empleado_del_mes introduce complejidad extra. El DAS Relacional necesita insertar los objetos bajando por el árbol formado por las relaciones de contención, compañía, luego departamento, y luego empleado. Esto es necesario por lo que siempre tiene la clave primaria autogenerada de un padre a mano para incluir una fila hija. Pero cuando se inserta la fila de la compañía, el empleado que es empleado del mes aún no ha sido insertado y la clave primaria no se conoce. El procedimiento es que después de insertar el registro del empleado y se conoce su clave primaria, se lleva a cabo un paso final en el que el registro de la compañía se actualiza con la clave primaria del empleado.
<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/*************************************************************************************
* Empty out the three tables
*************************************************************************************/
$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();
$sentencia_pdo = $gbd->prepare('DELETE FROM EMPLEADO;');
$filas_afectadas = $sentencia_pdo->execute();
/*************************************************************************************
* Crear una diminuta pero completa compañía.
* El nombre de la compañía es Acme.
* Existe un departamento, Zapatos.
* Existe un empleado, Sue.
* El empleado del mes es Sue.
*************************************************************************************/
$das = new SDO_DAS_Relational ($metadatos_bd,'compañía',$metadatos_contenedor_SDO);
$gbd = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$raíz = $das -> createRootDataObject();
$acme = $raíz -> createDataObject('compañía');
$acme -> nombre = "Acme";
$zapatos = $acme -> createDataObject('departamento');
$zapatos -> nombre = 'Zapatos';
$zapatos -> ubicación = 'A-block';
$sue = $zapatos -> createDataObject('employee');
$sue -> nombre = 'Sue';
$acme -> empleado_del_mes = $sue;
$das -> applyChanges($gbd, $raíz);
echo "Escritos Acme con un departamento y un empleado\n";
?>
Ejemplo #2 Una compañía, un departamento, un empleado - Recuperar y actualizar
La sentencia SQL pasada al DAS Relacional esta vez es una unión interna que recupera datos de las tres tablas. De otro modo este ejemplo no introduciría nada que ya no apareciera en los ejemplos anteriores.
El grafo se actualiza por la adición de un nuevo departamento y un nuevo empleado, y algunas alteraciones en las propiedades nombre de los objetos existentes en el grafo. Los cambios combinados son luego escritos. El DAS Relacional procesará y aplicará una mezcla arbitraria de adicioines, modificaciones y eliminaciones hacia y desde el grafo de datos.
<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/*************************************************************************************
* Buscar otra vez la compañía y cambiar varios aspectos.
* Cambiar el nombre de la compañía, del departamento y del empleado.
* Añadir un segundo departamento y un nuevo empleado.
* Cambiar el empleado del mes.
*************************************************************************************/
$das = new SDO_DAS_Relational ($metadatos_bd,'compañía',$metadatos_contenedor_SDO);
$gbd = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$raíz = $das->executeQuery($gbd,
"select c.id, c.nombre, c.empleado_del_mes, d.id, d.nombre, e.id, e.nombre " .
"from compañía c, departamento d, empleado e " .
"where e.id_dept = d.id and d.id_comp = c.id and c.nombre='Acme'",
array('compañía.id','compañía.nombre','compañía.empleado_del_mes',
'departamento.id','departamento.nombre','empleado.id','empleado.nombre'));
$acme = $raíz['compañía'][0];
$zapatos = $acme->departamento[0];
$sue = $zapatos -> employee[0];
$ti = $acme->createDataObject('departamento');
$ti->nombre = 'TI';
$ti->ubicación = 'G-block';
$billy = $ti->createDataObject('empleado');
$billy->nombre = 'Billy';
$acme->nombre = 'MegaCorp';
$zapatos->nombre = 'Calzado';
$sue->nombre = 'Susan';
$acme->empleado_del_mes = $billy;
$das -> applyChanges($gbd, $raíz);
echo "Escritos la compañía con un departamento y un empleado extras y cambiados los nombres (Megacorp/Calzado/Susan)\n";
?>
Ejemplo #3 Una compañía, dos departamentos, dos empleados - Recuperar y eliminar
La compañía se recupera como un grafo de datos completo que contiene cinco objetos de datos - la compañía, dos departamentos y dos empleados. Se eliminan todos eliminando el objeto compañía. Al eliminar un objeto de grafo se eliminan todos los objetos bajo él en el grafo. Se generarán y ejecutarán cinco sentencias DELETE de SQL. Ya que siempre estarán cualificadas con una cláusula WHERE que contiene todos los campos que fueron recuperados, cualquier actualización en los datos de la base de datos en el transcurso de otro proceso será detectada.
<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/*************************************************************************************
* Ahora leerla una vez más y eliminarla.
* Se puede eliminar parte, aplicar los cambios, y luego seguir trabajando con el mismo
* grafo, pero se ha de tener cuidado de mantener el cierre - no se puede eliminar el
* empleado que es emplado del mes sin reasignar. Por seguridad, aquí se elimina la
* compañía de una sola vez.
*************************************************************************************/
$das = new SDO_DAS_Relational ($metadatos_bd,'compañía',$metadatos_contenedor_SDO);
$gbd = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$raíz = $das->executeQuery($gbd,
"select c.id, c.nombre, c.empleado_del_mes, d.id, d.nombre, e.id, e.nombre " .
"from compañía c, departamento d, empleado e " .
"where e.id_dept = d.id and d.id_comp = c.id and c.nombre='MegaCorp';",
array('compañía.id','compañía.nombre','compañía.empleado_del_mes',
'departamento.id','departamento.nombre','empleado.id','empleado.nombre'));
$megacorp = $raíz['compañía'][0];
unset($raíz['compañía']);
$das -> applyChanges($gbd, $raíz);
echo "Eliminados la compañía, departamentos y empleados de una sola vez.\n";
?>