## Exemple avec trois tables

Les exemples suivant utilisent tous trois tables de la base de données compagnie : les tables compagnie, departement et employe. Elles introduisent le dernier morceau du fonctionnement non expliqué dans les exemples ci haut : la référence non contenue employe_du_mois.

Comme les exemples ci haut pour la compagnie et le département, la série d'exemples illustre le cycle de vie complet d'un graphique de données.

Exemple #1 Une compagnie, un département, un employé - Création

Dans cet exemple, une compagnie est créée contenant un département et seulement un employé. Notez que dans cet exemple, les trois tables sont vidées à leur démarrage ainsi les résultats exacts des requêtes peuvent être connus.

Notez comment une fois que la compagnie, le département et l'employé est créé que la propriété employe_du_mois de la compagnie peut être faite pour pointer au nouvel employé. Puisque c'est une référence qui n'est pas contenue, ceci ne peut être effectué tant que l'objet employé ait été créé dans le graphique. Les références non contenues doivent être gérées prudemment. Par exemple, si un employé est maintenant supprimé de son département, il ne serait pas correcte d'essayer de sauver le graphique sans premièrement effacer ou réassigner la propriété employe_du_mois. Cette règle SDO requiert que tous les objets pointé par une référence qui n'est pas contenue doit être aussi accessible par des relations contenues.

Lorsque vient le moment d'insérer le graphique dans la base de données, la procédure est similaire à l'exemple d'insertion d'une compagnie et d'un département, cependant, la propriété employe_du_mois introduit une plus grande complexité. Le DAS Relationnel doit insérer les objets en descendant l'arbre formée des relations contenues, donc la compagnie, ensuite le département et ensuite l'employée. Ceci est nécessaire puisqu'il y a toujours une clé primaire générée automatiquement du parent pour l'inclure dans une ligne du fils. Mais lorsque la compagnie est insérée, l'employée qui est l'employé du mois n'est pas encore inséré et la clé primaire est inconnue. La procédure est qu'après l'insertion de l'employé et que sa clé primaire soit connue, une dernière étape est effectuée qui permet de modifier la compagnie avec la clé primaire de l'employé.

`<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/*************************************************************************************
* Vidage des deux tables
*************************************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$pdo_stmt = $dbh->prepare('DELETE FROM COMPAGNIE;');
$rows_affected = $pdo_stmt->execute();
$pdo_stmt = $dbh->prepare('DELETE FROM DEPARTEMENT;');
$rows_affected = $pdo_stmt->execute();
$pdo_stmt = $dbh->prepare('DELETE FROM EMPLOYE;');
$rows_affected = $pdo_stmt->execute();
/*************************************************************************************
* Crée une compagnie minuscule mais complète.
* Le nom de la compagnie est Acme.
* Il y a un département, Chaussure.
* Il y a une employé, Bob.
* L'employé du mois est Bob.
*************************************************************************************/
$das = new SDO_DAS_Relational ($database_metadata,'compagnie',$SDO_containment_metadata);
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$root = $das -> createRootDataObject();
$acme = $root -> createDataObject('compagnie');
$acme -> nom = "Acme";
$chaussure = $acme -> createDataObject('departement');
$chaussure -> nom = 'Chaussure';
$chaussure -> emplacement = 'Bloc-A';
$bob = $chaussure -> createDataObject('employe');
$bob -> nom = 'Bob';
$acme -> employe_du_mois = $bob;
$das -> applyChanges($dbh, $root);
echo "Écriture de Acme avec un département et un employé\n";
?>`

Exemple #2 Une compagnie, un département, un employé - Récupération et Mise à Jour

La requête SQL passée à DAS Relationnel est cette fois un inner join qui récupère les données des trois tables. Autrement, cet exemple n'introduit rien de nouveau de l'exemple précédent

Le graphique est mis à jour avec l'addition d'un nouveau département et d'un nouvel employé et quelques modifications au propriétés de nom des objets existant dans le graphique. Les changements combinés sont écrits. Le DAS Relationnel traitera et appliquera un mélange arbitraire des additions, des modifications et des suppressions provenant et allant vers le graphique.

`<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/*************************************************************************************
* Trouve la compagnie encore et change certains aspects.
* Change le nom de la compagnie, le département et l'employé.
* Ajoute un second département et un nouvel employé.
* Change l'employé du mois
*************************************************************************************/
$das = new SDO_DAS_Relational ($database_metadata,'compagnie',$SDO_containment_metadata);
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$root = $das->executeQuery($dbh,
"select c.id, c.nom, c.employe_du_mois, d.id, d.nom, e.id, e.nom " .
"from compagnie c, departement d, employe e " .
"where e.dept_id = d.id and d.co_id = c.id and c.nom='Acme'",
array('compagnie.id','compagnie.nom','compagnie.employe_du_mois',
'departement.id','departement.nom','employe.id','employe.nom'));
$acme = $root['compagnie'][0];
$chaussure = $acme->departement[0];
$bob = $chaussure -> employe[0];
$it = $acme->createDataObject('departement');
$it->nom = 'IT';
$it->location = 'Bloc-G';
$billy = $it->createDataObject('employe');
$billy->nom = 'Billy';
$acme->nom = 'MegaCorp';
$chaussure->nom = 'Footwear';
$sue->nom = 'Suzan';
$acme->employe_du_mois = $billy;
$das -> applyChanges($dbh, $root);
echo "Écriture de la compagnie avec un département en plus et un employé et
tous les noms ont changés Megacorp/Footwear/Suzan)\n";
?>`

Exemple #3 Une compagnie, deux départements, deux employés - Récupération et Suppression

La compagnie est récupéré en tant qu'un graphique de données complet contenant cinq objets de données - la compagnie, deux départements et deux employés. Ils sont tous supprimés en supprimant l'objet compagnie. La suppression d'un objet du graphique supprime tous les objets sous celui-ci dans le graphique. Cinq requêtes DELETE SQL sera générées et exécutée. Comme d'habitude, elles seront qualifiées avec une clause WHERE qui contient tous les champs qui ont été récupérés, alors toutes les mises à jour des données dans la base de données pendant ce temps par un autre processus seront détectées.

`<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/*************************************************************************************
* Maintenant lit une ou plusieurs fois et supprime.
* Vous pouvez supprimer par partie, appliquer les changements, et ensuite
* continuer à travailler avec le même graphique de données mais la précaution
* est requise pour garder véracité - vous ne pouvez pas supprimer l'employé
* qui est l'employé du mois sans le réassigner. Pour plus de précaution ici,
* nous supprimons la compagnie en entier d'un seul coup.
*************************************************************************************/
$das = new SDO_DAS_Relational ($database_metadata,'compagnie',$SDO_containment_metadata);
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$root = $das->executeQuery($dbh,
"select c.id, c.nom, c.employe_du_mois, d.id, d.nom, e.id, e.nom " .
"from compagnie c, departement d, employe e " .
"where e.dept_id = d.id and d.co_id = c.id and c.nom='MegaCorp';",
array('compagnie.id','compagnie.nom','compagnie.employe_du_mois',
'departement.id','departement.nom','employe.id','employe.nom'));
$megacorp = $root['compagnie'][0];
unset($root['compagnie']);
$das -> applyChanges($dbh, $root);
echo "Suppression de la compagnie, des départements et des employés d'un seul coup.\n";
?>`