Object-Relational Mapping : Différence entre versions

De OviWiki
Aller à : navigation, rechercher
(Insérer des données (équivalent requêtes INSERT dans MySQL))
(Insérer des données (équivalent requêtes INSERT dans MySQL))
Ligne 135 : Ligne 135 :
 
====== Gestion des données liées ======
 
====== Gestion des données liées ======
  
Nos définitions de tables prévoyaient une liaison entre un contact et une adresse postale. Voici un exemple permettant d'insérer un contact et son adresse automatiquement. Il est nécessaire pour cela de définir une liaison .
+
Nos définitions de tables prévoyaient une liaison entre un contact et une adresse postale. Voici un exemple permettant d'insérer un contact et son adresse automatiquement. Il est nécessaire pour cela de définir une liaison JOIN :
 +
 
 +
<source lang="php">
 +
$contactset = new monmodule_ContactSet();
 +
$contactset->join('addressepostale');
 +
 
 +
$contact = $contactset->newRecord();
 +
 
 +
$contact->nom = 'Martin';
 +
$contact->prenom = 'Henry';
 +
$contact->addressepostale->rue = '45, rue Georges André';
 +
$contact->addressepostale->codepostal = '54000';
 +
$contact->addressepostale->ville = 'Nancy';
 +
 
 +
$contact->save();
 +
</source>
  
 
===== Sélectionner des données (équivalent requêtes SELECT en MySQL) =====
 
===== Sélectionner des données (équivalent requêtes SELECT en MySQL) =====

Version du 18 juin 2009 à 10:46

La librairie LibOrm (Object-Relational Mapping) est une bibliothèque de correspondance entre la base de données et des objets PHP. Elle facilite la définition des tables de données et les requêtes SQL.

Le module LibOrm est disponible sur CVS : [1]

Le chemin complet de la fonctionnalité
LibOrm
Documentation du parent
Pas de parent
Module
LibOrm
version du module
0.6.3


getDescription

Méthode commune à toutes les librairies pour obtenir la description de l'objet partagé.

$instance = bab_functionality::get('LibOrm');

$description = $instance->getDescription();


--> Cette page ne recense pas toutes les possibilités de la librairie. Elle donne un aperçu des fonctions permettant de débuter dans l'utilisation de la librairie.

Exemple

Nous travaillons sur un module d'Ovidentia qui requiert la librairie LibOrm. Pour plus d'explications sur la méthode d'intégration d'une librairie dans un module : Fichiers spécifiques des modules.

Dans notre module, nous gérons 2 tables de données : Contact et AdressePostale. Ces 2 tables sont liées car 1 contact a 1 adresse postale.

Les tables de données

Définition de la structure de la table AdressePostale. Il est indispensable de terminer le nom de la classe par Set.

<source lang="php"> class monmodule_AddressePostaleSet extends ORM_MySqlRecordSet {

  function __construct() {
     parent::__construct();
     
    $this->setPrimaryKey('id');
    $this->addFields(
       ORM_TextField('rue')->setDescription('Street'),
       ORM_StringField('codepostal', 10)->setDescription('Zip code'),
       ORM_StringField('ville', 60)->setDescription('City')
    );
  }

} </source>

Définition de la classe AdressePostale en tant qu'enregistrement (record). Lorsque la librairie LibOrm retournera une ligne de la table AdressePostale, la librairie retournera un objet de la classe AdressePostale. Remarque : si vous n'avez pas besoin de personnaliser la classe d'enregistrement, il n'est pas nécessaire de la créer. Elle sera automatiquement créée par la librairie à partir du nom de la classe AdressePostaleSet.

<source lang="php"> class monmodule_AddressePostale extends ORM_MySqlRecord {

} </source>


Définition de la structure de la table Contact :

<source lang="php"> class monmodule_ContactSet extends ORM_MySqlRecordSet {

  function __construct() {
     parent::__construct();
    
     $this->setPrimaryKey('id');
     $this->addFields(
        ORM_StringField('nom', 80)->setDescription('Nom'),
        ORM_StringField('prenom', 80)->setDescription('Prénom'),
        ORM_StringField('poste', 50)->setDescription('Métier'),
        ORM_StringField('bureau', 15)->setDescription('Bureau'),
        ORM_StringField('telephone', 30)->setDescription('Téléphone'),
        ORM_StringField('fax', 30)->setDescription('Fax'),
        ORM_StringField('mobile', 30)->setDescription('Téléphone Mobile'),
        ORM_StringField('email', 255)->setDescription('E-mail')
     );
     $this->hasOne('addressepostale', 'monmodule_AddressePostaleSet');
  }

} </source>

Définition de la classe Contact en tant qu'enregistrement (record).

<source lang="php"> class monmodule_Contact extends ORM_MySqlRecord {

} </source>

Utilisation de la librairie et initialisation

Après installation de la librairie sur le portail, vous pouvez l'utiliser dans votre code PHP en appelant la fonctionnalité. Il est nécessaire d'initialiser le back-end (la base de données) qui sera utilisé. En effet la librairie prévoit des requêtes dans différents formats de base de données : MySQL, XML, RSS...

Cet exemple montre l'utilisation du back-end MySQL. Le constructeur de la classe ORM_MySqlBackend prend en paramètre la variable globale d'Ovidentia (objet babDatabase) :

<source lang="php"> bab_functionality::get('LibOrm')->initMySql(); $mysqlbackend = new ORM_MySqlBackend($GLOBALS['babDB']); ORM_MySqlRecordSet::setBackend($mysqlbackend); </source>

Requêtes : gestion des données

Nous avons défini nos tables de données dans les chapitres précédents. Pour les exemples de requêtes les définitions de classes doivent être disponibles dans le code PHP.

Insérer des données (équivalent requêtes INSERT dans MySQL)

Pour ajouter une donnée (ici une adresse postale), on définit un nouvel enregistrement en utilisant la méthode newRecord() sur la classe de définition (ici monmodule_AdressePostaleSet).

<source lang="php"> $adresseset = new monmodule_AddressePostaleSet(); $adresse = $adresseset->newRecord(); </source>

Les champs définis dans la classe monmodule_AddressePostaleSet seront disponibles sous la forme de variables dans les objets de cette classe. La méthode save() sur l'objet effectuera l'enregistrement de la nouvelle donnée.

<source lang="php"> $adresseset = new monmodule_AddressePostaleSet(); $adresse = $adresseset->newRecord();

$adresse->rue = '45, rue Georges André'; $adresse->codepostal = '54000'; $adresse->ville = 'Nancy';

$adresse->save(); </source>

Remarque :

Dès l'utilisation de la méthode save() sur l'objet, vous travaillez sur la donnée enregistrée. Un nouvel appel à la méthode save() ne créera pas un nouvel enregistrement mais modifiera la donnée en cours :

<source lang="php"> $adresseset = new monmodule_AddressePostaleSet(); $adresse = $adresseset->newRecord();

$adresse->rue = '45, rue Georges André'; $adresse->codepostal = '54000'; $adresse->ville = 'Nancy';

$adresse->save();

$adresse->codepostal = '78000'; $adresse->ville = 'Versailles';

$adresse->save(); </source>

Gestion des données liées

Nos définitions de tables prévoyaient une liaison entre un contact et une adresse postale. Voici un exemple permettant d'insérer un contact et son adresse automatiquement. Il est nécessaire pour cela de définir une liaison JOIN :

<source lang="php"> $contactset = new monmodule_ContactSet(); $contactset->join('addressepostale');

$contact = $contactset->newRecord();

$contact->nom = 'Martin'; $contact->prenom = 'Henry'; $contact->addressepostale->rue = '45, rue Georges André'; $contact->addressepostale->codepostal = '54000'; $contact->addressepostale->ville = 'Nancy';

$contact->save(); </source>

Sélectionner des données (équivalent requêtes SELECT en MySQL)
Mettre à jour des données (équivalent requêtes UPDATE en MySQL)
Supprimer des données (équivalent requêtes DELETE en MySQL)