Doctrine ORM für PHP: Komplettguide mit Praxisbeispielen

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

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                    

Empfehlungen