Doctrine ORM für PHP: Komplettguide mit Praxisbeispielen
1. Was ist Doctrine ORM und warum braucht man es?
Doctrine ORM (Object-Relational Mapper) ist eine leistungsstarke PHP-Bibliothek, die das Data-Mapper-Entwurfsmuster implementiert. Im Gegensatz zu Active Record (wie in Laravel Eloquent verwendet) trennt Doctrine die Geschäftslogik (Entitäten) vollständig von der Datenbanklogik. Entitäten sind einfache PHP-Objekte (Plain Old PHP Objects, POPO), die nichts von der Existenz einer Datenbank wissen. Die gesamte Datenbankarbeit wird über ein zentrales Repository – den EntityManager – abgewickelt.
Warum ist das wichtig? Doctrine löst das grundlegende Problem der Diskrepanz zwischen dem objektorientierten Datenmodell und dem relationalen Datenbankmodell (Object-Relational Impedance Mismatch). Sie arbeiten mit Objekten und Collections, während Doctrine Ihre Aktionen automatisch in SQL-Abfragen übersetzt. Das ermöglicht saubereren, testbareren und wartbareren Code, besonders in großen Enterprise-Projekten.
Die wichtigsten Vorteile: volle Kontrolle über SQL (via DQL – Doctrine Query Language), Lazy Loading, ein flexibles Event-System (Lifecycle Events), Unterstützung für Vererbung (Mapped Superclass, Single Table Inheritance, Joined Table Inheritance), ein integrierter Query Builder und Hydratoren (Hydration Modes). Doctrine ist der De-facto-Standard für komplexe PHP-Anwendungen (Symfony, Drupal, Magento).
2. Installation
Die Installation erfolgt über Composer (das Pendant zu pip für PHP). Für die grundlegende Nutzung reichen zwei Pakete:
composer require doctrine/orm
composer require doctrine/dbal
composer require symfony/cache # Empfohlen für das Caching von Metadaten
Für die Arbeit mit Annotationen (veraltet, aber beliebt) wird ein zusätzliches Paket benötigt:
composer require doctrine/annotations
Für die Arbeit mit YAML- oder XML-Konfiguration:
composer require symfony/yaml # Für YAML
Stellen Sie nach der Installation sicher, dass der Composer-Autoloader in Ihrem Projekt eingebunden ist:
require_once __DIR__ . '/vendor/autoload.php';
3. Schnellstart – minimales funktionierendes Beispiel
Wir erstellen eine einfache Entität User und speichern sie in einer SQLite-Datenbank.
Schritt 1: Konfiguration des EntityManagers (bootstrap.php)
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\ORMSetup;
use Doctrine\DBAL\DriverManager;
require_once __DIR__ . '/vendor/autoload.php';
// Pfade zu den Entitäten und Entwicklungsmodus festlegen
$paths = [__DIR__ . '/src/Entity'];
$isDevMode = true;
// ORM-Konfiguration erstellen
$config = ORMSetup::createAttributeMetadataConfiguration($paths, $isDevMode);
// Datenbankverbindung konfigurieren (SQLite)
$connectionParams = [
'driver' => 'pdo_sqlite',
'path' => __DIR__ . '/data/database.sqlite',
];
$connection = DriverManager::getConnection($connectionParams, $config);
// EntityManager erstellen
$entityManager = new EntityManager($connection, $config);
Schritt 2: Entität erstellen (src/Entity/User.php)
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'users')]
class User
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private int|null $id = null;
#[ORM\Column(type: 'string', length: 100)]
private string $name;
#[ORM\Column(type: 'string', length: 255, unique: true)]
private string $email;
public function getId(): ?int
{
return $this->id;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getEmail(): string
{
return $this->email;
}
public function setEmail(string $email): self Auch in der Bibliothek
Überwachung von Java-Anwendungen: Tools und Bibliotheken zur Metrikenerfassung
Testen in Swift (iOS/macOS): Frameworks und Werkzeuge
openai-api-rs Rust: Vollständige Anleitung mit Codebeispielen
E-Mail-Versand mit PHP: PHPMailer, SwiftMailer und mail() – vollständige Anleitung
typia für TypeScript: Komplettguide mit Praxisbeispielen