Les exemples suivants utilisent tous deux tables de la base de données compagnie : les tables compagnie et departement. Ces exemples montrent plus le fonctionnement de DAS Relationnel.
Dans cette série d'exemples, une compagnie et un département son créé, récupéré, mis à jour et finalement supprimé. Ceci montre le cycle de vie pour un graphique de données contenant plus d'un objet. Notez que cet exemple vide les tables compagnie et departement au démarrage, ainsi les résultats exacts des requêtes peuvent être connus.
Vous pouvez trouvez ces exemples combinés dans un script appelé 1cd-CRUD dans le répertoire Scenarios du paquetage DAS Relationnel.
Exemple #1 Une compagnie, un département - Création
Comme dans l'exemple précédent où l'on créait juste un objet de données de compagnie, la première action après la construction du DAS Relationnel est d'appeler createRootDataObject() pour obtenir l'objet racine spécial du graphique de données vide. L'objet compagnie est alors créé en tant que fils de cet objet racine, et l'objet departement en tant que fils de l'objet compagnie.
Lorsqu'il est venu le temps d'appliquer les changements, le DAS Relationnel doit effectuer des traitements spéciaux pour maintenir la clé étrangère qui supporte les relations contenues, en particulier si une clé primaire générée automatiquement est en jeu. Dans cet exemple, les relations entre la clé primaire générée automatiquement id dans la table compagnie et la colonne co_id dans la table departement doivent être maintenues. Lors de l'insertion de la compagnie et du département pour la première fois, le DAS Relationnel doit premièrement insérer une ligne de compagnie, ensuite appeler la méthode de PDO getLastInsertId() pour obtenir la clé primaire générée automatiquement, et ensuite ajouter la valeur à la colonne co_id lors de l'insertion de la ligne departement.
<?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();
/**************************************************************
* Crée une compagnie avec le nom Acme et un département, département de Chaussure
***************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$das = new SDO_DAS_Relational ($database_metadata,'compagnie',$SDO_containment_metadata);
$root = $das -> createRootDataObject();
$acme = $root -> createDataObject('compagnie');
$acme -> nom = "Acme";
$chaussure = $acme->createDataObject('departement');
$chaussure->nom = 'Chaussure';
$das -> applyChanges($dbh, $root);
?>
Exemple #2 Une compagnie, un département - Récupération et Mise à jour
Dans ce cas, la requête SQL passé à executeQuery() exécute un inner join pour joindre les données des tables compagnie et departement. Les clés primaires pour les tables compagnie et departement doivent être incluses dans la requête. Le jeu de résultats est normalisé de nouveau pour former un graphique de données normalisé. Notez que le spécificateur de colonne est passé en troisième argument de l'appel executeQuery() qui autorise DAS Relationnel de savoir quelle colonne est laquelle dans le jeu de résultats.
Notez que la colonne co_id bien qu'utilisée dans la requête n'est pas requis dans le jeu de résultats. Afin de comprendre que fait DAS Relationnel lorsqu'il construit le graphique de données, il peut être utile de visualiser à quoi ressemble les jeu de résultats. Bien que les données dans la base de données sont normalisée, alors plusieurs lignes de département peuvent pointer vers la clé étrangère d'une ligne de compagnie, les données dans le jeu de résultats sont non-normalisée : c'est, s'il y a une compagnie et de multiples département, les valeurs pour la compagnie qui sont répétées à chaque ligne. Le DAS Relationnel doit renverser ce processus et retourner le jeu de résultats dans un graphique normalisé, avec seulement un objet compagnie.
Dans cet exemple, le DAS Relationnel examine le jeu de résultats et le spécificateur de colonne, trouve les données pour les tables compagnie et departement, trouve les clés primaires pour les deux et interprète chaque ligne comme contenant des données d'un département et comme parent compagnie. S'il n'a pas vue de données de la compagnie auparavant (il utilise la clé primaire pour vérifier), il crée un objet compagnie et ensuite l'objet compagnie sous lui. S'il a vu des données pour la compagnie avant et a déjà créé l'objet compagnie, il crée simplement l'objet departement sous lui.
De cette manière, le DAS Relationnel peut récupérer et normaliser de nouveau les données pour de multiples compagnies et de multiples départements sous ceux-ci.
<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/**************************************************************
* Récupération de la compagnie et du département de Chaussure, ensuite
* supprime Chaussure et ajoute IT
***************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$das = new SDO_DAS_Relational ($database_metadata,'compagnie',$SDO_containment_metadata);
$root = $das->executeQuery($dbh,
'select c.id, c.nom, d.id, d.nom from compagnie «c, departement d where d.co_id = c.id',
array('compagnie.id','compagnie.nom','departement.id','departement.nom'));
$acme = $root['compagnie'][0]; // récupère la première compagnie - sera 'Acme'
$chaussure = $acme['departement'][0]; // récupère le premier département en dessous - sera 'Chaussure'
unset($acme['departement'][0]);
$it = $acme->createDataObject('departement');
$it->name = 'IT';
$das -> applyChanges($dbh, $root);
?>
Exemple #3 Une compagnie, deux départements - Récupération et Suppression
Dans cet exemple, la compagnie et le département sont récupérés et ensuite supprimés. Il n'est pas nécessaire de les supprimer individuellement (bien que cela est possible) - la suppression de l'objet compagnie du graphique de données supprime aussi tous les départements sous lui.
Notez le moyen de l'objet compagnie est actuellement supprimé en utilisant l'appel unset de PHP. La suppression doit être effectuée sur la propriété qui est dans ce cas la propriété de compagnie sur l'objet racine spécial. Vous devez utiliser :
<?php
unset($root['company'][0]);
?>
<?php
unset($acme); //FAUX
?>
<?php
require_once 'SDO/DAS/Relational.php';
require_once 'company_metadata.inc.php';
/**************************************************************
* Récupération de la compagnie et du département IT, ensuite supprime la
* compagnie entière
***************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$das = new SDO_DAS_Relational ($database_metadata,'compagnie',$SDO_containment_metadata);
$root = $das->executeQuery($dbh,
'select c.id, c.nom, d.id, d.nom from compagnie c, departement d where d.co_id = c.id',
array('compagnie.id','compagnie.nom','departement.id','departement.nom'));
$acme = $root['compagnie'][0];
$it = $acme['departement'][0];
unset($root['compagnie'][0]);
$das -> applyChanges($dbh, $root);
?>