ORM pour PHP : comparaison de Doctrine, Eloquent et Propel avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

ORM pour PHP : comparaison de Doctrine, Eloquent et Propel



Le mapping objet-relationnel (ORM) est une technologie qui permet aux développeurs de travailler avec des bases de données en utilisant une approche orientée objet plutôt que d'écrire des requêtes SQL brutes. Pour PHP, il existe plusieurs solutions ORM matures, chacune avec ses propres atouts. Dans cet article, nous comparerons en détail trois des ORM les plus populaires : Doctrine, Eloquent (de Laravel) et Propel, et nous fournirons des exemples pratiques de code.



1. Doctrine : un DataMapper puissant



Doctrine est sans doute l'ORM le plus mature et le plus fonctionnel pour PHP. Il implémente le modèle DataMapper, ce qui signifie une séparation complète entre la logique métier et la logique de gestion de la base de données. Principales caractéristiques :



  • Prise en charge de plusieurs SGBD (MySQL, PostgreSQL, SQLite, Oracle, MSSQL)
  • Système de requêtes flexible via DQL (Doctrine Query Language)
  • Prise en charge intégrée des migrations, événements, objets proxy (chargement paresseux)
  • Haute performance avec une configuration de cache appropriée


Exemple : définition d'une entité et requête



// Entité Useruse Doctrine\\ORM\\Mapping as ORM;

#[ORM\\Entity]#[ORM\\Table(name: "users")]class User{ #[ORM\\Id] #[ORM\\GeneratedValue] #[ORM\\Column(type: "integer")] private int $id;

#[ORM\\Column(type: "string", length: 100)] private string $name;

#[ORM\\Column(type: "string", length: 255, unique: true)] private string $email;

// Getters et setters public function getId(): int { return $this->id; } public function getName(): string { return $this->name; } public function setName(string $name): void { $this->name = $name; } public function getEmail(): string { return $this->email; } public function setEmail(string $email): void { $this->email = $email; }}

// Requête via EntityManager$userRepository = $entityManager->getRepository(User::class);$users = $userRepository->findBy(['name' => 'Иван'], ['id' => 'DESC'], 10);foreach ($users as $user) { echo $user->getName() . ' - ' . $user->getEmail() . PHP_EOL;}


2. Eloquent : simplicité et élégance



Eloquent est l'ORM standard du framework Laravel, implémentant le modèle ActiveRecord. Chaque modèle est à la fois une entité et un repository. Principaux avantages :



  • Code minimal pour les opérations standard
  • Belle interface fluide pour la construction de requêtes
  • Relations intégrées (belongsTo, hasMany, morphMany, etc.)
  • Excellente documentation et immense communauté


Exemple : modèle et requêtes



// Modèle User (fichier app/Models/User.php)namespace App\\Models;

use Illuminate\\Database\\Eloquent\\Model;

class User extends Model{ protected $fillable = ['name', 'email']; // Définition de la relation "un à plusieurs" public function posts() { return $this->hasMany(Post::class); }}

// Utilisation dans un contrôleur$users = User::where('name', 'LIKE', '%Иван%') ->orderBy('created_at', 'desc') ->limit(10) ->get();

foreach ($users as $user) { echo $user->name . ' - ' . $user->email . PHP_EOL; // Chargement paresseux des enregistrements associés foreach ($user->posts as $post) { echo ' Post : ' . $post->title . PHP_EOL; }}


3. Propel : performance et génération de code



Propel est un ORM qui génère des classes basées sur un schéma de base de données (XML ou YAML). Il utilise le modèle ActiveRecord, mais avec un accent sur la performance et le typage strict. Caractéristiques clés :



  • Génération des classes de modèles (pas besoin d'écrire les getters/setters manuellement)
  • Intégré

Recommendations