Was ist Doctrine ORM und warum braucht man es?
Doctrine ORM (Object-Relational Mapping) ist eine leistungsstarke Bibliothek für PHP, die Entwicklern ermöglicht, mit Datenbanken objektorientiert zu arbeiten, anstatt rohe SQL-Abfragen zu schreiben. Doctrine ORM ist der De-facto-Standard für Symfony, kann aber auch in jedem anderen PHP-Projekt (Laravel, Yii, reines PHP) eingesetzt werden.
Das Hauptproblem, das Doctrine löst: die Diskrepanz zwischen dem relationalen Datenmodell (Tabellen, Zeilen, Spalten) und dem objektorientierten Modell (Klassen, Objekte, Eigenschaften). Doctrine wandelt PHP-Objekte automatisch in Datenbankeinträge um und umgekehrt.
Schlüsselfunktionen:
- Automatische Schemaerstellung – basierend auf Annotationen/Attributen in den Klassen
- Repository Pattern – komfortable Methoden zum Suchen und Filtern von Daten
- DQL (Doctrine Query Language) – eine objektorientierte Abfragesprache
- Lazy Loading – verknüpfte Daten werden nur bei Bedarf geladen
- Migrationen – Verwaltung von Schemaänderungen der Datenbank
- Transaktionen – vollständige ACID-Unterstützung
- Caching – von Metadaten, Abfragen und Ergebnissen
Doctrine ORM eignet sich für Projekte jeder Größe: von kleinen Webseiten bis hin zu Unternehmenssystemen mit Hunderten von Tabellen.
Installation von Doctrine ORM
Die Installation erfolgt über Composer (den PHP-Paketmanager). Öffnen Sie ein Terminal im Stammverzeichnis Ihres Projekts und führen Sie Folgendes aus:
composer require doctrine/orm
Für die Arbeit mit Symfony empfiehlt sich die Installation des DoctrineBundle-Pakets:
composer require symfony/orm-pack
composer require --dev symfony/maker-bundle # zum Generieren von Code
Wenn Sie reines PHP ohne Framework verwenden, müssen Sie zusätzlich den Treiber für Ihre Datenbank installieren:
composer require doctrine/dbal
composer require doctrine/annotations # für die Arbeit mit Annotationen (PHP 7.4 und älter)
Für die Arbeit mit PHP 8+ Attributen (empfohlene Methode): Annotationen sind nicht erforderlich, Doctrine unterstützt native Attribute.
Schnellstart: Codebeispiel
Betrachten wir ein einfaches Beispiel – die Erstellung einer Entität "Product" und das Speichern in der Datenbank.
1. Erstellen der Entitätsklasse (Entity)
<?php
// src/Entity/Product.php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'products')]
class Product
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'string', length: 255)]
private string $name;
#[ORM\Column(type: 'float')]
private float $price;
// Getter und Setter
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 getPrice(): float
{
return $this->price;
}
public function setPrice(float $price): self
{
$this->price = $price;
return $this;
}
}
2. Objekt erstellen und speichern
<?php
// In einem Symfony-Controller oder an einer beliebigen anderen Stelle
use App\Entity\Product;
use Doctrine\ORM\EntityManagerInterface;
class ProductController
{
public function createProduct(EntityManagerInterface $entityManager)
{
$product = new Product();
$product->setName('Laptop');
$product->setPrice(49999.99);
// Doctrine mitteilen, dass das Objekt gespeichert werden soll
$entityManager->persist($product);
// INSERT in die Datenbank ausführen
$entityManager->flush();
// Jetzt enthält $product->getId() die ID des neuen Eintrags
return Auch in der Bibliothek
Datenvalidierung in TypeScript: Bibliotheken, Ansätze und Codebeispiele
Internationalisierung (i18n) in JavaScript (Node.js): Die Bibliothek i18next
Konfiguration von C++-Anwendungen: Bibliotheken und Werkzeuge für flexible Einstellungen
JSON-Verarbeitung in Rust: serde_json, simd-json, json5 und andere Bibliotheken