Help me bij het beheren van database-migraties in Symfony met Doctrine Migrations.
description
Door deze prompt te gebruiken, krijg je duidelijke richtlijnen voor het beheren van database-migraties, minimaliseer je downtime en zorg je dat je databaseschema altijd synchroon loopt met je applicatiecode.
prompt
try_prompt
Ik wil mijn database-migraties effectief beheren in Symfony met Doctrine Migrations. Mijn huidige database-instelling is: {{database_instelling}}. Geef gedetailleerde sta ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een uitgebreide gids voor het effectief beheren van database-migraties in Symfony met Doctrine Migrations, afgestemd op jouw situatie met MySQL en tabellen voor gebruikers en producten.
---
## 1. Voorbereiding en installatie
**a. Doctrine Migrations bundle installeren**
Voer in je projectdirectory uit:
```bash
composer require doctrine/doctrine-migrations-bundle
```
**b. Configuratie instellen**
Stel de migratieconfiguratie in `config/packages/doctrine_migrations.yaml` in:
```yaml
doctrine_migrations:
migrations_paths:
'DoctrineMigrations': '%kernel.project_dir%/migrations'
storage:
table_storage:
table_name: 'migration_versions'
```
---
## 2. Migraties genereren en beheren
### 2.1. Nieuwe migratie aanmaken
Na het aanbrengen van wijzigingen in je entiteiten (bijvoorbeeld nieuwe kolommen of tabellen), genereer je een migratie:
```bash
php bin/console doctrine:migrations:diff
```
Dit maakt een nieuwe migratieklasse aan in de map `migrations/`.
**Voorbeeld:**
Als je een nieuwe kolom `date_of_birth` toevoegt aan de `User`-entiteit, wordt de gegenereerde migratie automatisch de juiste SQL-commando's bevatten.
---
### 2.2. Migratie uitvoeren
Voer de migraties uit op de database:
```bash
php bin/console doctrine:migrations:migrate
```
Bij de eerste keer wordt de migratie toegepast. Voor staging of productie kun je dit commando gebruiken om je database te updaten.
---
### 2.3. Migratie terugdraaien
Om de laatste migratie ongedaan te maken:
```bash
php bin/console doctrine:migrations:execute <versie> --down
```
Of, eenvoudiger, om de laatste migratie terug te draaien:
```bash
php bin/console doctrine:migrations:rollback
```
**Tip:** Controleer altijd de migratie-geschiedenis vóór het terugdraaien.
---
## 3. Migratiebeheer voor staging en productie
### 3.1. Versiebeheer en omgeving
- **Staging**: Gebruik een kopie van de database voor testen. Voer hier migraties uit na het testen.
- **Productie**: Pas migraties toe na goedkeuring. Zorg dat je altijd een backup hebt vóór het uitvoeren.
### 3.2. Best practices
- **Migraties in versiebeheer opnemen**: Commiteer de gegenereerde migratiebestanden in je Git-repository.
- **Automatisering**: Gebruik CI/CD pipelines om migraties automatisch uit te voeren na het deployen.
- **Back-ups maken**: Maak altijd een back-up van je database vóór het uitvoeren van migraties op productie.
---
## 4. Praktische voorbeelden
### Voorbeeld 1: Nieuwe kolom toevoegen aan `User`
1. Voeg een nieuwe property toe aan je `User`-entiteit:
```php
// src/Entity/User.php
/**
* @ORM\Column(type="date", nullable=true)
*/
private $dateOfBirth;
```
2. Genereer migratie:
```bash
php bin/console doctrine:migrations:diff
```
3. Bekijk de gegenereerde migratie en voer uit:
```bash
php bin/console doctrine:migrations:migrate
```
---
### Voorbeeld 2: Een kolom verwijderen
1. Verwijder of wijzig de property in je entiteit.
2. Genereer migratie:
```bash
php bin/console doctrine:migrations:diff
```
3. Voer de migratie uit:
```bash
php bin/console doctrine:migrations:migrate
```
---
## 5. Extra tips en best practices
- **Gebruik `diff` alleen voor nieuwe wijzigingen**: Het is aanbevolen om migraties handmatig te reviewen voordat je ze toepast.
- **Gebruik `migrations:status`** om de status van migraties te controleren.
- **Maak gebruik van `migrations:latest`** om te zien welke migratie de laatste is.
- **Versiebeheer migratiebestanden** en documenteer grote wijzigingen.
---
## Samenvatting
| Stap | Commando / Actie | Toelichting |
|------------------------------|---------------------------------------------------------------|----------------------------------------------------------|
| Installatie | `composer require doctrine/doctrine-migrations-bundle` | Bundle toevoegen aan Symfony |
| Migratie genereren | `php bin/console doctrine:migrations:diff` | Automatisch SQL genereren voor entiteitswijzigingen |
| Migratie toepassen | `php bin/console doctrine:migrations:migrate` | Wijzigingen doorvoeren in database |
| Migratie terugdraaien | `php bin/console doctrine:migrations:rollback` | Laatste migratie ongedaan maken |
| Status controleren | `php bin/console doctrine:migrations:status` | Migratiestatus bekijken |
---
Mocht je aanvullende vragen hebben of specifieke scenario’s willen bespreken, laat het gerust weten!
provider: deepseek
model: deepseek-chat
Hier is een gedetailleerde handleiding voor het effectief beheren van Doctrine Migrations in Symfony, afgestemd op jouw MySQL database met gebruikers- en producttabellen:
## 1. Installatie en Configuratie
### Doctrine Migrations installeren:
```bash
composer require doctrine/doctrine-migrations-bundle
```
### Configuratie (config/packages/doctrine_migrations.yaml):
```yaml
doctrine_migrations:
migrations_paths:
'DoctrineMigrations': '%kernel.project_dir%/migrations'
storage:
table_name: 'migration_versions'
all_or_nothing: true
check_database_platform: true
```
## 2. Migraties Maken
### Voorbeeld: Nieuwe kolom toevoegen aan gebruikers tabel
```bash
# Genereer een lege migratie
php bin/console make:migration
# Of genereer vanuit entiteit wijzigingen
php bin/console doctrine:migrations:diff
```
### Voorbeeld migratiebestand (migrations/Version20240115120000.php):
```php
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20240115120000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Voeg telefoonnummer toe aan gebruikers tabel';
}
public function up(Schema $schema): void
{
$this->addSql('ALTER TABLE users ADD phone_number VARCHAR(20) DEFAULT NULL');
// Index toevoegen voor betere prestaties
$this->addSql('CREATE INDEX IDX_1483A5E9444F97DD ON users (phone_number)');
}
public function down(Schema $schema): void
{
$this->addSql('DROP INDEX IDX_1483A5E9444F97DD ON users');
$this->addSql('ALTER TABLE users DROP phone_number');
}
}
```
### Complexer voorbeeld: Product tabel uitbreiden
```php
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20240115120001 extends AbstractMigration
{
public function getDescription(): string
{
return 'Uitbreiden product tabel met categorie en voorraad';
}
public function up(Schema $schema): void
{
// Nieuwe tabel voor categorieën
$this->addSql('CREATE TABLE product_categories (
id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(100) NOT NULL,
description LONGTEXT DEFAULT NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
// Wijzig product tabel
$this->addSql('ALTER TABLE products
ADD category_id INT DEFAULT NULL,
ADD stock_quantity INT NOT NULL DEFAULT 0,
ADD is_active TINYINT(1) NOT NULL DEFAULT 1');
$this->addSql('ALTER TABLE products
ADD CONSTRAINT FK_PRODUCTS_CATEGORY
FOREIGN KEY (category_id)
REFERENCES product_categories (id)');
$this->addSql('CREATE INDEX IDX_PRODUCTS_CATEGORY ON products (category_id)');
}
public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE products DROP FOREIGN KEY FK_PRODUCTS_CATEGORY');
$this->addSql('DROP INDEX IDX_PRODUCTS_CATEGORY ON products');
$this->addSql('ALTER TABLE products DROP category_id, DROP stock_quantity, DROP is_active');
$this->addSql('DROP TABLE product_categories');
}
}
```
## 3. Migraties Uitvoeren
### Testomgeving (staging):
```bash
# Toon beschikbare migraties
php bin/console doctrine:migrations:status
# Voer migraties uit
php bin/console doctrine:migrations:migrate
# Specifieke versie uitvoeren
php bin/console doctrine:migrations:migrate 20240115120000
# Droprun (toon SQL zonder uitvoeren)
php bin/console doctrine:migrations:migrate --dry-run
```
### Productieomgeving:
```bash
# Veilige uitvoering met bevestiging
php bin/console doctrine:migrations:migrate --no-interaction
# Met SQL output voor logging
php bin/console doctrine:migrations:migrate --query-time
```
## 4. Migraties Terugdraaien
### Laatste migratie ongedaan maken:
```bash
php bin/console doctrine:migrations:execute --down 'DoctrineMigrations\\Version20240115120000'
# Of terug naar specifieke versie
php bin/console doctrine:migrations:migrate prev
php bin/console doctrine:migrations:migrate 20240115100000
```
## 5. Best Practices voor Staging en Productie
### Omgevingsspecifieke configuratie:
```yaml
# config/packages/doctrine_migrations.yaml
doctrine_migrations:
migrations_paths:
'DoctrineMigrations': '%kernel.project_dir%/migrations'
storage:
table_name: 'migration_versions_%env(APP_ENV)%'
```
### Deployment workflow:
```bash
# 1. Voor staging
APP_ENV=staging php bin/console doctrine:migrations:migrate --no-interaction
# 2. Testen op staging
# 3. Voor productie
APP_ENV=prod php bin/console doctrine:migrations:migrate --no-interaction
```
### Migratie scripts voor deployment:
```bash
#!/bin/bash
# deploy-migrations.sh
echo "Controleren of migraties klaar zijn..."
php bin/console doctrine:migrations:status
echo "Migraties uitvoeren..."
php bin/console doctrine:migrations:migrate --no-interaction
if [ $? -eq 0 ]; then
echo "Migraties succesvol uitgevoerd"
else
echo "Fout bij uitvoeren migraties"
exit 1
fi
```
## 6. Geavanceerde Technieken
### Voorwaardelijke migraties:
```php
public function up(Schema $schema): void
{
if (!$schema->getTable('users')->hasColumn('phone_number')) {
$this->addSql('ALTER TABLE users ADD phone_number VARCHAR(20) DEFAULT NULL');
}
}
```
### Data migraties:
```php
public function postUp(Schema $schema): void
{
// Standaard categorieën toevoegen
$this->connection->insert('product_categories', [
'name' => 'Standaard',
'description' => 'Standaard productcategorie',
'created_at' => (new \DateTime())->format('Y-m-d H:i:s')
]);
}
```
## 7. Monitoring en Onderhoud
### Migratie status controleren:
```bash
# Toon uitgevoerde migraties
php bin/console doctrine:migrations:list
# Toon migraties die nog uitgevoerd moeten worden
php bin/console doctrine:migrations:status --show-versions
```
### Migratie best practices:
- **Versionering**: Gebruik betekenisvolle beschrijvingen
- **Testen**: Altijd testen op staging voor productie
- **Backup**: Maak database backup voor grote migraties
- **Documentatie**: Houd changelog bij van database wijzigingen
- **Rollback**: Zorg dat down() methodes correct werken
Deze aanpak zorgt voor robuust migratiebeheer in zowel staging als productie omgevingen, specifiek afgestemd op jouw gebruikers- en producttabellen.

