Doctrine (ORM)

Doctrine

Informations
Première version Voir et modifier les données sur Wikidata
Dernière version 3.1.3 ()[1]Voir et modifier les données sur Wikidata
Dépôt github.com/doctrine/ormVoir et modifier les données sur Wikidata
Écrit en PHPVoir et modifier les données sur Wikidata
Système d'exploitation MultiplateformeVoir et modifier les données sur Wikidata
Type PHP library (d)Voir et modifier les données sur Wikidata
Licence Licence MITVoir et modifier les données sur Wikidata
Site web www.doctrine-project.orgVoir et modifier les données sur Wikidata

modifier - modifier le code - voir Wikidata (aide) Consultez la documentation du modèle

Doctrine est un ORM (couche d'abstraction à la base de données) pour PHP. Il s'agit d'un logiciel libre sous licence GNU LGPL.
Doctrine est l'ORM par défaut du framework Symfony (depuis la version 1.3 de ce framework). Cependant, son utilisation dans le cadre d'un projet développé avec Symfony est optionnelle. De plus, il peut être utilisé avec de nombreux autres frameworks tels que Zend Framework, CodeIgniter, FLOW3 ou encore Lithium.

Historique

Lancé en 2006 par Konsta Vesterinen, le projet Doctrine est inspiré de l'ORM Java Hibernate[2] et se base sur patron de conception data mapper.

Doctrine 2.0 est ensuite paru le 22 décembre 2010.

Présentation

Pour comprendre où se situe Doctrine ORM, il faut savoir que Doctrine se compose de deux grandes parties :

  • Doctrine ORM ;
  • Doctrine DBAL.

Doctrine "ORM" (Mapping Objet-Relationnel ou Object Relational Mapping) se base sur Doctrine "DBAL" (Couche d'abstraction de base de données ou DataBase Abstraction Layer) qui également s'appuie sur PDO (PHP Data Objects). Il est à noter que PDO est activé par défaut depuis la version PHP 5.1 et ne fait pas partie de Doctrine.

PDO

PDO est une interface objet permettant d’accéder à une base de données en PHP et qui élève le niveau de sécurité (via par exemple les requêtes préparées) par rapport aux méthodes classiques utilisant des fonctions devenues obsolètes depuis PHP 5.5.0 et retirées en PHP 7.0.0 (comme les fonctions "mysql_connect()" et "mysqli_insert()"), c'est une interface d'abstraction à l'accès aux données sur laquelle se base Doctrine DBAL.

DBAL

DBAL se positionne juste au‑dessus de PDO. DBAL lui ajoute des fonctionnalités (quelques drivers) mais étend également la notion d'abstraction du simple accès aux données (en PDO) aux bases de données, ainsi Doctrine DBAL permet de manipuler les bases de données en offrant par exemple des fonctions[3] qui listent les tables, les champs, le détails des structures, etc.

ORM

ORM fournit la persistance transparente des objets PHP. C'est l'interface qui permet de faire le lien ou "mapping" entre les objets et les éléments de la base de données (que gère DBAL).

Si par exemple DBAL retourne dans la base de données une table "Article" avec 3 champs: "ID", "Titre" et "Contenu" et si l'application utilise un objet "Post" avec les attributs "ID", "Title" et "Content" (leur équivalent en anglais), ORM permettra très facilement de faire correspondre chaque attribut de l'objet Post au champ correspondant dans la table via un fichier de mapping (format YAML, XML ou annotations dans un fichier PHP). Ainsi, un enregistrement correspond à une instance (et vice versa) et une table correspond à une classe (ou entité).

Doctrine Query Language

Le Doctrine Query Langage (DQL) est un langage de requête orienté objet propre à Doctrine. Il peut être utilisé à la place du langage SQL pour créer les requêtes d'accès et de manipulation des données de la base de données. Sa syntaxe s'inspire du Hibernate Query Langage, le langage de requête d'Hibernate, et du Java Persistence Query Language, celui de JPA.

Exemples d'utilisation

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article relève du guide pratique, ce qui n'est pas de nature encyclopédique ().

Vous pouvez reformuler les passages concernés, ou remplacer ce bandeau soit par {{pour Wikibooks}}, {{pour Wikiversité}}, ou {{pour Wikivoyage}}, afin de demander le transfert vers un projet frère plus approprié.

Select

$users = Doctrine::getTable('users')->findAll();
foreach($users as $user) {
    echo "<h2>$user->name</h2>";
}

en fonction PHP :

function getCategoryDescription($id)
{
    $q = Doctrine_Query::CREATE()
        ->select('description')
        ->from('Category c')
        ->where('c.category_id = ?', $id)
    ;

    return $q->fetchOne();
}

fetchOne retourne un résultat, fetchArray, un tableau. Ceci compte le nombre d'enregistrements pour une relation.

$q = Doctrine_Query::create()
    ->select('u.*, COUNT(DISTINCT p.id) AS count_phonenumbers')
    ->from('User u')
    ->leftJoin('u.Phonenumbers p')
    ->groupBy('u.id')
;
$users = $q->fetchArray();

echo $users[0]['Phonenumbers'][0]['count_phonenumbers'];

Insert

 $user = new User();
 $user->name = 'John';
 $user->password = 'Doe';
 $user->save();

 echo "L'utilisateur avec l'id $user->id a été ajouté";

Update

  $user = Doctrine::getTable('user')->findOneById(2);
  $user->phone = '+33 1 23 45 67 89';
  $user->save();

Delete

  $user = Doctrine::getTable('user')->findBySlug('kevin-smith');
  $user->remove();

SQL natif

Par ailleurs, Doctrine permet également d'exécuter des requêtes SQL, ce qui peut s'avérer utile lorsque des annotations doivent être interprétées en commentaire[4]. Exemple :

$query = $this
    ->getEntityManager()
    ->getConnection()
    ->prepare('SELECT * FROM maTable')
;
$query->execute();

var_dump($query->fetchAll());

Ou :

var_dump(
    $this
        ->get('doctrine.dbal.default_connection')
        ->executeQuery('SELECT * FROM maTable')
        ->fetchAll(\PDO::FETCH_ASSOC)
);

Histoire

Le projet Doctrine a été lancé par Konsta Vesterinen en 2006. Il repose sur une communauté de développeurs et reçoit des contributions, notamment du projet Google Summer of Code.

Doctrine 1.0.0 a été publié en 2008[5].

La première version stable de Doctrine 2.0 date de 2010[6].

Influences

Doctrine a été influencé par de nombreux projets et de nombreuses personnes. La principale influence est l'ORM Java Hibernate. Le but du projet Doctrine est de fournir un outil équivalent dans le langage PHP.

Références

  1. « Release 3.1.3 », (consulté le )
  2. « Doctrine 2 ORM Best Practices », sur ocramius.github.io
  3. (en) « Documentation Doctrine DBAL »
  4. « Raw SQL Queries », sur SymfonyCasts - PHP and Symfony Video Tutorial Screencasts
  5. « Doctrine 1.0 Released - Doctrine - PHP Database Tools », sur www.doctrine-project.org
  6. « Doctrine 2 First Stable Release - Doctrine - PHP Database Tools », sur www.doctrine-project.org

Liens externes

  • Site officiel
v · m
Personnalités
Ressources
Implémentations
Frameworks web
Test
Mapping objet-relationnel
Environnement de développement
Toolkit
  • icône décorative Portail des bases de données
  • icône décorative Portail des logiciels libres
  • icône décorative Portail de la programmation informatique