Migrationen erstellen und anwenden
Migrationen erstellen und anwenden
~13 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026
Die Project-Entity aus Kapitel 19 existiert bisher NUR als PHP-Code – die Datenbank weiß noch NICHTS von einer project-Tabelle. Migrationen schließen diese Lücke NACHVOLLZIEHBAR und VERSIONIERT.
Warum Migrationen statt direktem Schema-Update?
Doctrine bietet ZWEI Wege, das Datenbankschema an die Entities anzupassen – beide erzeugen dasselbe Ergebnis, aber mit einem entscheidenden Unterschied:
| Ansatz | Eigenschaften |
|---|---|
| doctrine:schema:update --force | Ändert die Datenbank SOFORT und DIREKT, OHNE Protokoll – schnell für lokales Experimentieren, aber NICHT nachvollziehbar und NICHT reproduzierbar auf anderen Umgebungen. |
| Migrationen (make:migration) | Erzeugt eine PHP-Datei mit explizitem SQL für UP (anwenden) und DOWN (rückgängig machen) – versioniert, im Git-Repository nachvollziehbar, IDENTISCH auf jeder Umgebung ausführbar. |
Achtung: doctrine:schema:update --force ist NUR für lokale Entwicklung/Prototyping gedacht. Für JEDE Anwendung, die in Produktion läuft (also praktisch jede echte Anwendung), sind Migrationen der einzig sinnvolle Weg – sie ermöglichen es, das Schema auf dem Produktionsserver GENAU nachzuvollziehen, wie es lokal entstanden ist.
Eine Migration erstellen
php bin/console make:migrationDoctrine vergleicht die AKTUELLEN Entity-Definitionen mit dem AKTUELLEN Datenbankschema und generiert automatisch das nötige SQL für die Differenz:
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20260806120000 extends AbstractMigration
{
public function up(Schema $schema): void
{
$this->addSql('CREATE TABLE project (
id SERIAL NOT NULL,
name VARCHAR(255) NOT NULL,
description TEXT DEFAULT NULL,
created_at TIMESTAMP(0) NOT NULL,
PRIMARY KEY(id)
)');
}
public function down(Schema $schema): void
{
$this->addSql('DROP TABLE project');
}
}up() wendet die Änderung AN, down() macht sie RÜCKGÄNGIG – beide sollten IMMER zueinander passen, damit sich eine Migration im Notfall sauber zurückrollen lässt.
Die Migration anwenden
php bin/console doctrine:migrations:migrateFragt zur Bestätigung nach (mit -n übersprungen, nützlich für automatisierte Deployments in Kapitel 48). Doctrine führt ALLE noch nicht angewendeten Migrationen in chronologischer Reihenfolge aus und protokolliert den Stand in einer internen doctrine_migration_versions-Tabelle.
Den aktuellen Migrationsstatus prüfen
php bin/console doctrine:migrations:statusEine Migration rückgängig machen
php bin/console doctrine:migrations:migrate prevFührt down() der ZULETZT angewendeten Migration aus – nützlich, wenn sich bei einer neuen Migration ein Fehler zeigt, BEVOR sie in Produktion geht.
Der Standard-Workflow ab jetzt
- Entity anlegen oder ändern (wie in Kapitel 19).
php bin/console make:migration– Doctrine generiert das SQL automatisch.- Die generierte Migrationsdatei DURCHLESEN – Doctrine ist meist zuverlässig, aber gerade bei komplexeren Änderungen (z. B. Umbenennungen) lohnt sich eine manuelle Prüfung.
php bin/console doctrine:migrations:migrate– anwenden.- Migration UND Entity-Änderung GEMEINSAM committen – sie gehören untrennbar zusammen.
Tipp: Dieser Fünf-Schritte-Workflow begleitet uns durch den GESAMTEN restlichen Block 4 – jede neue Entity oder Beziehung folgt genau diesem Muster.