ORM für PHP: Überblick und Vergleich der beliebtesten Bibliotheken
ORM (Object-Relational Mapping) ist eine Technologie, die es ermöglicht, mit Datenbanken über Objekte der Programmiersprache zu arbeiten, anstatt über SQL-Abfragen. In PHP gibt es mehrere leistungsstarke ORM-Bibliotheken, jede mit ihren eigenen Besonderheiten, Vorteilen und Nachteilen. In diesem Artikel vergleichen wir vier der bekanntesten Lösungen im Detail: Doctrine, Eloquent, Propel und RedBeanPHP. Sie erfahren, wie sie aufgebaut sind, sehen Codebeispiele und können eine fundierte Entscheidung für Ihr Projekt treffen.
1. Doctrine — volle Kontrolle und leistungsstarkes DQL
Doctrine ist das ausgereifteste und funktionsreichste ORM für PHP. Es besteht aus zwei Komponenten: DBAL (Database Abstraction Layer) und ORM (Object-Relational Mapping). Doctrine verwendet das Data Mapper-Muster, was eine vollständige Trennung von Geschäftslogik und Datenhaltungslogik bedeutet.
Hauptmerkmale:
- Vollständige Unterstützung der Doctrine Query Language (DQL) — objektorientiertes SQL
- Flexibles Migrationssystem (Doctrine Migrations)
- Lazy und Eager Loading von Beziehungen
- Unterstützung des ereignisgesteuerten Lebenszyklus von Entitäten
- Integrierter Cache (für Metadaten, Abfragen, Ergebnisse)
Codebeispiel:
<?php// Definition einer Entität (Entity)use Doctrine\\ORM\\Mapping as ORM;
/** * @ORM\\Entity * @ORM\\Table(name="users") */class User{ /** @ORM\\Id @ORM\\Column(type="integer") @ORM\\GeneratedValue */ private int $id;
/** @ORM\\Column(type="string", length=100) */ private string $name;
/** @ORM\\Column(type="string", unique=true) */ private string $email;
// Getter und Setter 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; }}
// Verwendung$entityManager = EntityManager::create($connectionParams, $config);$user = new User();$user->setName('Ivan Petrov');$user->setEmail('ivan@example.com');$entityManager->persist($user);$entityManager->flush();
// Abfrage mit DQL$query = $entityManager->createQuery('SELECT u FROM App\\Entity\\User u WHERE u.email = :email');$query->setParameter('email', 'ivan@example.com');$result = $query->getOneOrNullResult();2. Eloquent — Einfachheit und Eleganz (Laravel)
Eloquent ist ein ORM, das Teil des Laravel-Frameworks ist, aber auch separat über das Paket illuminate/database verwendet werden kann. Es verwendet das Active Record-Muster, bei dem jedes Modell eine Zeile in der Datenbanktabelle darstellt. Eloquent ist bekannt für seine intuitive Syntax und die automatische Verwaltung von Beziehungen.
Hauptmerkmale:
- Minimale Konfiguration — Konventionen statt Konfiguration
- Leistungsstarke Beziehungen: belongsTo, hasMany, belongsToMany u. a.
- Automatische Verwaltung von Zeitstempeln (created_at, updated_at)
- Integrierte Scopes, Mutators und Accessors
- Unterstützung von Collections und Paginierung
Codebeispiel:
<?phpuse Illuminate\\Database\\Eloquent\\Model;
class User extends Model{ protected $table = 'users'; protected $fillable = ['name', 'email']; protected $hidden = ['password'];
// "Eins-zu-viele"-Beziehung public function posts() { return $this->hasMany(Post::class); }}
// Datensatz erstellen$user = User::create([ 'name' => 'Anna Smirnova', 'email' => 'anna@example.com',]);
// Abfrage mit Bedingungen$activeUsers = User::where('status', 'active')