> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Databasemigraties

> Leer hoe je met de migratiefunctionaliteit van Laravel je databaseschema onder versiebeheer brengt.

## Wat zijn migraties

Migraties zijn een soort versiebeheer voor je database.
Ze stellen een team in staat om de definitie van het databaseschema van de applicatie te delen en te beheren.

Je hebt vast weleens meegemaakt dat je na het pullen van de broncode aan teamleden moest vertellen: "voeg handmatig een kolom toe aan je lokale database".
Migraties lossen dat probleem op.

Migratiebestanden staan in de directory `database/migrations`.
Elke bestandsnaam bevat een timestamp die Laravel gebruikt om de uitvoeringsvolgorde van de migraties te bepalen.

## Een migratiebestand aanmaken

Met het Artisan-commando `make:migration` genereer je een nieuw migratiebestand.

```shell theme={null}
php artisan make:migration create_posts_table
```

Laravel leidt uit de migratienaam de tabelnaam af en genereert een passende stub.
Heet de migratie `create_posts_table`, dan staat de code om de tabel `posts` aan te maken al voor je klaar.

## De structuur van een migratie

Een migratieklasse heeft twee methoden: `up` en `down`.

* De `up`-methode: voegt tabellen, kolommen en indexen toe aan de database.
* De `down`-methode: maakt de bewerkingen van `up` ongedaan. Wordt aangeroepen bij een rollback.

```php theme={null}
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Voer de migratie uit
     */
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('body');
            $table->boolean('published')->default(false);
            $table->timestamps();
        });
    }

    /**
     * Maak de migratie ongedaan
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
```

## De belangrijkste kolomdefinitiemethoden

De `Blueprint`-klasse biedt een groot aantal kolomtypen.

| Methode                             | Beschrijving                                                         |
| ----------------------------------- | -------------------------------------------------------------------- |
| `$table->id()`                      | Auto-incrementele primaire sleutel (alias van `bigIncrements('id')`) |
| `$table->string('name')`            | Kolom vergelijkbaar met VARCHAR (standaard 255 tekens)               |
| `$table->text('body')`              | TEXT-kolom                                                           |
| `$table->integer('count')`          | INTEGER-kolom                                                        |
| `$table->boolean('active')`         | Slaat een booleaanse waarde op als TINYINT                           |
| `$table->timestamp('published_at')` | TIMESTAMP-kolom                                                      |
| `$table->timestamps()`              | Voegt `created_at` en `updated_at` in één keer toe                   |
| `$table->softDeletes()`             | Voegt een `deleted_at`-kolom toe voor soft deletes                   |
| `$table->foreignId('user_id')`      | `BIGINT UNSIGNED`-kolom voor foreign keys                            |

### Kolommodifiers

Aan kolomdefinities voeg je modifiers toe via een methodchain.

```php theme={null}
$table->string('email')->unique();
$table->string('name')->nullable();
$table->integer('votes')->default(0);
$table->string('title')->after('id'); // Plaatsen na de opgegeven kolom
```

## Migraties uitvoeren

Met het commando `migrate` voer je alle nog niet uitgevoerde migraties uit.

```shell theme={null}
php artisan migrate
```

Om te zien welke migraties al zijn uitgevoerd en welke nog niet, gebruik je `migrate:status`.

```shell theme={null}
php artisan migrate:status
```

<Warning>
  Voer je migraties uit in productie, dan verschijnt er een bevestigingsprompt.
  Wil je zonder bevestiging uitvoeren, gebruik dan de flag `--force` — maar wees voorzichtig, want sommige bewerkingen kunnen data laten verdwijnen.
</Warning>

## Rollback

Om de laatste batch migraties terug te draaien gebruik je `migrate:rollback`.

```shell theme={null}
php artisan migrate:rollback
```

Wil je een specifiek aantal stappen terugdraaien, geef dan de optie `--step` op.

```shell theme={null}
# De laatste 5 migraties terugdraaien
php artisan migrate:rollback --step=5
```

Om alle migraties terug te draaien en daarna opnieuw uit te voeren gebruik je `migrate:refresh`.

```shell theme={null}
php artisan migrate:refresh
```

<Info>
  `migrate:refresh` bouwt alle tabellen opnieuw op, waardoor bestaande data verloren gaat.
  Handig om de database tijdens de ontwikkeling te resetten.
</Info>

## Praktijkvoorbeeld: de posts-tabel aanmaken

Aan de hand van een `posts`-tabel voor blogposts lopen we het hele proces door.

### 1. Het migratiebestand genereren

```shell theme={null}
php artisan make:migration create_posts_table
```

### 2. De migratie bewerken

Open en bewerk `database/migrations/xxxx_xx_xx_xxxxxx_create_posts_table.php`.

```php theme={null}
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->cascadeOnDelete();
            $table->string('title');
            $table->text('body');
            $table->boolean('published')->default(false);
            $table->timestamp('published_at')->nullable();
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};
```

### 3. De migratie uitvoeren

```shell theme={null}
php artisan migrate
```

Na uitvoering is de tabel `posts` in de database aangemaakt.

### 4. Later een kolom toevoegen

Wil je na het aanmaken van de tabel een nieuwe kolom toevoegen, bewerk dan niet de bestaande migratie, maar maak een nieuwe migratie aan.

```shell theme={null}
php artisan make:migration add_excerpt_to_posts_table
```

```php theme={null}
public function up(): void
{
    Schema::table('posts', function (Blueprint $table) {
        $table->string('excerpt')->nullable()->after('title');
    });
}

public function down(): void
{
    Schema::table('posts', function (Blueprint $table) {
        $table->dropColumn('excerpt');
    });
}
```

<Tip>
  Vermijd het direct bewerken van bestaande migratiebestanden.
  Dat verstoort de consistentie met andere teamleden en de productieomgeving.
  Voeg wijzigingen altijd toe als nieuwe migratie.
</Tip>

## Migratie-events

Bij elke migratiebewerking worden [events](/nl/events) uitgezonden. Alle events erven over van `Illuminate\Database\Events\MigrationEvent`.

| Klasse                                           | Beschrijving                                                                  |
| ------------------------------------------------ | ----------------------------------------------------------------------------- |
| `Illuminate\Database\Events\DatabaseRefreshed`   | Na afronding van het commando `migrate:refresh`                               |
| `Illuminate\Database\Events\MigrationsStarted`   | Vlak voordat een batch migraties wordt uitgevoerd                             |
| `Illuminate\Database\Events\MigrationsEnded`     | Na afronding van een batch migraties                                          |
| `Illuminate\Database\Events\MigrationStarted`    | Vlak voordat een enkele migratie wordt uitgevoerd                             |
| `Illuminate\Database\Events\MigrationEnded`      | Na afronding van een enkele migratie                                          |
| `Illuminate\Database\Events\NoPendingMigrations` | Wanneer een migratiecommando vaststelt dat er geen openstaande migraties zijn |
| `Illuminate\Database\Events\SchemaDumped`        | Na afronding van een databaseschemadump                                       |
| `Illuminate\Database\Events\SchemaLoaded`        | Na het laden van een bestaande schemadump                                     |

Je kunt bijvoorbeeld luisteren naar het event `MigrationsEnded` en na afronding van de migraties de cache legen.

```php theme={null}
use Illuminate\Database\Events\MigrationsEnded;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Event;

Event::listen(MigrationsEnded::class, function () {
    Cache::flush();
});
```

## Volgende stappen

<Card title="Databaseseeding" icon="seedling" href="/nl/seeding">
  Leer hoe je voorbeelddata plaatst in de tabellen die je met migraties hebt aangemaakt.
</Card>

<Card title="Introductie tot Eloquent" icon="database" href="/nl/eloquent">
  Leer hoe je de tabellen die je met migraties hebt aangemaakt bewerkt met de Eloquent ORM.
</Card>


## Related topics

- [Mappenstructuur](/nl/directory-structure.md)
