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é
Aussi dans la bibliothèque
Surveillance des applications PHP avec PHPMetrics
Travailler avec Kafka en TypeScript : la bibliothèque KafkaJS et exemples
Flyway Java : guide complet avec exemples pratiques
Surveillance des applications Kotlin : bibliothèque Ktor Metrics et Micrometer