Soutenez-nous

FAQ PHPConsultez toutes les FAQ

Nombre d'auteurs : 68, nombre de questions : 580, dernière mise à jour : 29 juillet 2013 

 
OuvrirSommaireBases de donnéesMapping objet relationnel (ORM) et persistanceDoctrine

Doctrine est une bibliothèque d'ORM pour PHP. Elle repose sur l'extension PDO.

Mis à jour le 26 août 2008  par Guillaume Rossolini

Il faut télécharger la dernière version des scripts : http://www.doctrine-project.org/

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 :
Sélectionnez
svn co http://doctrine.pengus.net/svn/trunk .
Mis à jour le 26 août 2008  par Guillaume Rossolini

Lien : Comment installer une bibliothèque ?
Lien : Comment installer une extension pour PHP ?

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).

Créé le 11 juillet 2007  par 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 :
Sélectionnez
models
User.php
Message.php
models/User.php
Sélectionnez
<?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 :
Sélectionnez
<?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 :
Sélectionnez
<?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 :
Sélectionnez
<?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 :
Sélectionnez
<?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'));

?>
Créé le 11 juillet 2007  par 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
Sélectionnez
<?php

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

?>
index.php
Sélectionnez
<?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();

?>
Créé le 11 juillet 2007  par Guillaume Rossolini

Admettons les tables "user" et "message". Nous allons ajouter deux utilisateurs, ainsi qu'un message au premier utilisateur :

models/User.php
Sélectionnez
<?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
Sélectionnez
<?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'
            )
        );
    }
}

?>
 
Sélectionnez

<?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();

?>
Créé le 11 juillet 2007  par Guillaume Rossolini

Supposant que Doctrine est prêt à être utilisé (partout dans symfony dès que le plug-in est chargé, après l'inclusion de son en-tête sinon), des modèles créés, etc., vous pouvez utiliser ce code pour effectuer une requête SELECT simple sur une table dont vous avez le modèle :

 
Sélectionnez
$q = Doctrine_Query::create()
    ->from('table t')
    ->select('t.*');

La partie from permet de sélectionner la table à partir de laquelle la requête sera exécutée ainsi qu'un alias, pour simplifier les écritures suivantes. Le select définit l'opération à effectuer sur la table : ici, sélectionner toutes les colonnes de tous les enregistrements.

Dans la partie from, notez que Doctrine utilise exclusivement des objets ! Le langage DQL de requêtes pour Doctrine ne permet pas d'utiliser directement les tables dans la base de données, il doit passer par les objets créés, par les modèles.

Maintenant, vous voudrez probablement ne sélectionner qu'une partie des enregistrements :

 
Sélectionnez
$q = Doctrine_Query::create()
    ->from('table t')
    ->select('t.*')
    ->where('t.id = ?', $id);

La clause where ici ajoutée fonctionne exactement comme en SQL. Remarquez l'utilisation des requêtes préparées, il s'agit d'une technique très simple évitant une bonne partie des injections SQL et autres en base de données, étant donné que le point d'interrogation sera remplacé par la valeur après vérification sécuritaire.

Maintenant, pour récupérer les données, deux manières de procéder : soit vous récupérez une liste d'objet dans laquelle vous pourrez itérer à l'aide d'un foreach, soit un objet seul.

Pour une collection d'objets :

 
Sélectionnez
$res = $q->execute();
 
foreach($res as $r)
{
    // faites quelque chose de l'enregistrement $r ici
}

Pour un seul enregistrement :

 
Sélectionnez
$r = $q->fetchOne();
 
// faites quelque chose de l'enregistrement $r ici
Créé le 23 février 2011  par Forum PHP
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2003 Developpez.com 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.