Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence
logo
Sommaire > Bases de données > Mapping objet relationnel (ORM) et persistance > Doctrine
        Qu'est-ce que Doctrine ?
        Comment installer Doctrine ?
        Comment fonctionne Doctrine ?
        Comment gérer la persistance avec Doctrine ?
        Comment ajouter des tuples à une table avec Doctrine ?
        Comment relier deux tables avec Doctrine (relation 1,N) ?



Qu'est-ce que Doctrine ?
auteur : Guillaume Rossolini
en Doctrine est une bibliothèque d'ORM pour PHP. Elle repose sur l'extension PDO.


Comment installer Doctrine ?
auteur : Guillaume Rossolini
Il faut télécharger la dernière version des scripts via SubVersion : http://trac.phpdoctrine.org/wiki/doctrineSvn

PDO et le driver de votre BDD pour PDO doivent également être activés, et PHP >= 5.1 est nécessaire.
Commande SVN permettant de récupérer les sources :
svn co http://doctrine.pengus.net/svn/trunk .
lien : faq Comment installer une bibliothèque ?
lien : faq Comment installer une extension pour PHP ?

Comment fonctionne Doctrine ?
auteur : Guillaume Rossolini
Doctrine permet d'utiliser une base de données sans écrire de requêtes SQL, en utilisant des classes personnalisées.

Il faut mettre les classes personnalisées (dérivées de Doctrine_Record) dans un répertoire, par exemple "/models", ce qui permet à Doctrine de les utiliser pour deviner la structure de la base de données (c'est la persistance).

Chaque classe doit définir sa structure (ses champs) et les relations avec les autres classes. Doctrine s'occupe des relations (JOIN entre tables, clefs étrangères).


Comment gérer la persistance avec Doctrine ?
auteur : Guillaume Rossolini
Avec Doctrine, il y a deux manières de gérer la persistance des objets vers la BDD : tout un répertoire de classes, ou bien une liste précise de classes.
Structure des répertoires :
models
User.php
Message.php
models/User.php
<?php

class User extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('name', 'string', 15);
        $this->hasColumn('password', 'string', 40);
    }
}

?>
Exporter toutes les classes d'un répertoire :
<?php

require_once 'classes/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));

// Créer la connexion à la BDD
$pdo = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');
$db = Doctrine_Manager::connection($pdo);

// Persistance des classes PHP vers la BDD
Doctrine::export('models');

// Syntaxe alternative :
$db->export->export('models');

?>
Récupérer les requêtes de persistance de tout un répertoire :
<?php

require_once 'classes/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));

// Créer la connexion à la BDD
$pdo = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');
$db = Doctrine_Manager::connection($pdo);

// Récupérer les requêtes sans les exécuter :
$queries = Doctrine::exportSql('models');

// Syntaxe alternative :
$queries = $db->export->exportSql('models');

?>
Exporter une liste de classes :
<?php

require_once 'classes/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));

// Inclure tous les modèles un à un
require_once 'models/User.php';

// Créer la connexion à la BDD
$pdo = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');
$db = Doctrine_Manager::connection($pdo);

// Persistance des classes PHP vers la BDD
$db->export->exportClasses(array('User'));

?>
Récupérer les requêtes de persistance d'une liste de classes :
<?php

require_once 'classes/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));

// Inclure tous les modèles un à un
require_once 'models/User.php';

// Créer la connexion à la BDD
$pdo = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');
$db = Doctrine_Manager::connection($pdo);

// Récupérer les requêtes sans les exécuter :
$queries = $db->export->exportClassesSql(array('User'));

?>

Comment ajouter des tuples à une table avec Doctrine ?
auteur : Guillaume Rossolini
C'est le travail de la méthode Doctrine_Record::save(), il faut donc utiliser une classe dérivée de Doctrine_Record.

Prenons l'exemple d'une table "user" :
models/User.php
<?php

class User extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('name', 'string', 15);
        $this->hasColumn('password', 'string', 40);
    }
}

?>
index.php
<?php

// Inclure les classes nécessaires
require_once 'doctrine/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));

// Créer la connexion à la BDD
$pdo = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');
$db = Doctrine_Manager::connection($pdo);

// Persistance des classes vers la BDD
Doctrine::export('models');

// Créer un utilisateur
$user = new User();
$user->name = 'Yogui';
$user->password = strval(sha1('1234'));
$user->save();

// Créer un autre utilisateur
$user = new User();
$user->name = 'BrYs';
$user->password = strval(sha1('4321'));
$user->save();

?>

Comment relier deux tables avec Doctrine (relation 1,N) ?
auteur : Guillaume Rossolini
Admettons les tables "user" et "message". Nous allons ajouter deux utilisateurs, ainsi qu'un message au premier utilisateur :
models/User.php
<?php

class User extends Doctrine_Record
{
    public function setTableDefinition()
    {
        // set 'user' table columns, note that
        // id column is always auto-created

        $this->hasColumn('name', 'string', 15);
        $this->hasColumn('password', 'string', 40);
    }

    public function setUp()
    {
        $this->hasMany
        (
            'Message as messages',
            array
            (
                'local' => 'id',
                'foreign' => 'user_id'
            )
        );
    }
}

?>
models/Message.php
<?php

class Message extends Doctrine_Record
{
    public function setTableDefinition()
    {
        // set 'user' table columns, note that
        // id column is always auto-created

        $this->hasColumn('title', 'string', 50);
        $this->hasColumn('text', 'string', 1000);
        $this->hasColumn('user_id', 'integer');
    }

    public function setUp()
    {
        $this->hasOne
        (
            'User',
            array
            (
                'local' => 'user_id',
                'foreign' => 'id',
                'onDelete' => 'CASCADE'
            )
        );
    }
}

?>

<?php

// Inclure les classes nécessaires
require_once 'doctrine/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));

// Créer la connexion à la BDD
$pdo = new PDO('mysql:host=localhost;dbname=developpez', 'Yogui', 'motdepasse');
$db = Doctrine_Manager::connection($pdo);

// Exporter les classes PHP en tant que tables vers la BDD
Doctrine::export('models');

$user = new User();
$user->name = 'Yogui';
$user->password = strval(sha1('1234'));
$user->messages[0]->title = 'test';
$user->messages[0]->text = 'Message de test';
$user->save();

$user = new User();
$user->name = 'BrYs';
$user->password = strval(sha1('4321'));
$user->save();

?>


Consultez les autres F.A.Q.


Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright ©2003  Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com