ORM für PHP: Vergleich von Doctrine, Eloquent und Propel mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

ORM für PHP: Vergleich von Doctrine, Eloquent und Propel



Objektrelationales Mapping (ORM) ist eine Technologie, die es Entwicklern ermöglicht, mit Datenbanken zu arbeiten, indem sie einen objektorientierten Ansatz anstelle von reinen SQL-Abfragen verwenden. Für PHP gibt es mehrere ausgereifte ORM-Lösungen, jede mit ihren eigenen Stärken. In diesem Artikel vergleichen wir die drei beliebtesten ORMs im Detail: Doctrine, Eloquent (aus Laravel) und Propel, und geben praktische Codebeispiele.



1. Doctrine: Leistungsstarker DataMapper



Doctrine ist wohl das ausgereifteste und funktionsreichste ORM für PHP. Es implementiert das DataMapper-Muster, was eine vollständige Trennung von Geschäftslogik und Datenbanklogik bedeutet. Hauptmerkmale:



  • Unterstützung vieler DBMS (MySQL, PostgreSQL, SQLite, Oracle, MSSQL)
  • Flexibles Abfragesystem über DQL (Doctrine Query Language)
  • Integrierte Unterstützung für Migrationen, Ereignisse, Proxy-Objekte (Lazy Loading)
  • Hohe Leistung bei richtiger Cache-Konfiguration


Beispiel: Entitätsdefinition und Abfrage



// Entität 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;

// Getter und Setter 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; }}

// Abfrage über EntityManager$userRepository = $entityManager->getRepository(User::class);$users = $userRepository->findBy(['name' => 'Ivan'], ['id' => 'DESC'], 10);foreach ($users as $user) { echo $user->getName() . ' - ' . $user->getEmail() . PHP_EOL;}


2. Eloquent: Einfachheit und Eleganz



Eloquent ist das Standard-ORM des Laravel-Frameworks und implementiert das ActiveRecord-Muster. Jedes Modell ist gleichzeitig Entität und Repository. Hauptvorteile:



  • Minimaler Code für Standardoperationen
  • Schönes fluent-Interface für die Abfrageerstellung
  • Integrierte Beziehungen (belongsTo, hasMany, morphMany usw.)
  • Hervorragende Dokumentation und riesige Community


Beispiel: Modell und Abfragen



// Modell User (Datei app/Models/User.php)namespace App\\Models;

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

class User extends Model{ protected $fillable = ['name', 'email']; // Definition der "Eins-zu-Viele"-Beziehung public function posts() { return $this->hasMany(Post::class); }}

// Verwendung im Controller$users = User::where('name', 'LIKE', '%Ivan%') ->orderBy('created_at', 'desc') ->limit(10) ->get();

foreach ($users as $user) { echo $user->name . ' - ' . $user->email . PHP_EOL; // Lazy Loading der verknüpften Datensätze foreach ($user->posts as $post) { echo ' Beitrag: ' . $post->title . PHP_EOL; }}


3. Propel: Leistung und Codegenerierung



Propel ist ein ORM, das Klassen basierend auf einem Datenbankschema (XML oder YAML) generiert. Es verwendet das ActiveRecord-Muster, jedoch mit Fokus auf Leistung und strenge Typisierung. Hauptmerkmale:



  • Generierung von Modellklassen (kein manuelles Schreiben von Gettern/Settern nötig)
  • Integriert

Empfehlungen