Zum Hauptinhalt springen

Was ist Seeding

Seeding ist ein Mechanismus, um Beispiel- oder Ausgangsdaten in Ihre Datenbank zu schreiben. Beim Einrichten der Entwicklungsumgebung oder bei automatisierten Tests benötigen Sie oft eine Datenbank in einem vordefinierten Zustand. Statt jedes Mal manuell zu befüllen, bündeln Sie das Vorgehen in Seeder-Klassen. Seeder liegen unter database/seeders. Standardmäßig existiert die Klasse DatabaseSeeder.

Seeder erzeugen

Neue Seeder erzeugen Sie mit make:seeder.
php artisan make:seeder UserSeeder
Ergebnis: database/seeders/UserSeeder.php.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Seeder ausführen
     */
    public function run(): void
    {
        // Datenlogik hier
    }
}

Seeder implementieren

Die Logik zur Datenerzeugung schreiben Sie in run(). Sie können sowohl die DB-Facade als auch Eloquent verwenden.

Mit der DB-Facade

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class UserSeeder extends Seeder
{
    public function run(): void
    {
        DB::table('users')->insert([
            [
                'name' => 'Yamada Taro',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
                'created_at' => now(),
                'updated_at' => now(),
            ],
            [
                'name' => 'Suzuki Hanako',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
                'created_at' => now(),
                'updated_at' => now(),
            ],
        ]);
    }
}

Mit Eloquent

use App\Models\User;
use Illuminate\Support\Facades\Hash;

public function run(): void
{
    User::create([
        'name' => 'Admin',
        'email' => '[email protected]',
        'password' => Hash::make('password'),
    ]);
}
Während des Seedings ist der Mass-Assignment-Schutz automatisch deaktiviert. $fillable und $guarded müssen Sie nicht beachten.

Kombination mit Model Factories

Für viele Testdaten sind Model Factories ideal. Sie erzeugen zufällige Dummy-Daten in Massen.
use App\Models\User;
use App\Models\Post;

public function run(): void
{
    // 10 Benutzer erstellen
    User::factory(10)->create();

    // Für jeden Benutzer 3 Beiträge
    User::factory(5)
        ->hasPosts(3)
        ->create();
}
Details zu Factories finden Sie in der Dokumentation zu Eloquent-Factories.

Der DatabaseSeeder

DatabaseSeeder ist der Einstiegspunkt, um mehrere Seeder zu koordinieren. Mit call() bestimmen Sie, welche ausgeführt werden.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
            PostSeeder::class,
            CommentSeeder::class,
        ]);
    }
}
Die Reihenfolge entspricht der Übergabe. Wenn Fremdschlüssel im Spiel sind, seeden Sie referenzierte Tabellen zuerst (z. B. usersposts).

Seeder ausführen

Alle ausführen

php artisan db:seed
Ruft DatabaseSeeder auf, der die in call() gelisteten Seeder abarbeitet.

Nur einen bestimmten Seeder

Mit --class.
php artisan db:seed --class=UserSeeder

Zusammen mit Migrationen

Mit migrate:fresh --seed legen Sie alle Tabellen neu an und seeden anschließend.
php artisan migrate:fresh --seed
Auf einen bestimmten Seeder beschränken via --seeder.
php artisan migrate:fresh --seed --seeder=UserSeeder
migrate:fresh löscht und erstellt alle Tabellen neu – bestehende Daten sind weg. Nicht in Produktion nutzen.

Ausführung in Produktion

In Produktion erscheint eine Bestätigungsabfrage. Mit --force überspringen Sie sie.
php artisan db:seed --force
Seeding in Produktion kann bestehende Daten überschreiben. Legen Sie vorher immer ein Backup an.

Modell-Events unterdrücken

Um zu verhindern, dass Modell-Events wie creating/created beim Seeding gefeuert werden, nutzen Sie den Trait WithoutModelEvents.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;

class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;

    public function run(): void
    {
        $this->call([
            UserSeeder::class,
        ]);
    }
}
Der Trait wirkt auch auf die per call() aufgerufenen Sub-Seeder.

Beispiel: Seeder einer Blog-Anwendung

Initialdaten für Nutzer und Beiträge:
// database/seeders/UserSeeder.php
class UserSeeder extends Seeder
{
    public function run(): void
    {
        User::factory(10)->create();
    }
}

// database/seeders/PostSeeder.php
class PostSeeder extends Seeder
{
    public function run(): void
    {
        // Jeder Nutzer bekommt 2–5 Beiträge
        User::all()->each(function ($user) {
            Post::factory(rand(2, 5))->create([
                'user_id' => $user->id,
            ]);
        });
    }
}

// database/seeders/DatabaseSeeder.php
class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
            PostSeeder::class, // nach users
        ]);
    }
}
Ausführen:
php artisan migrate:fresh --seed

Nächste Schritte

Einstieg in Eloquent

Nutzen Sie die geseedeten Daten in Ihren Eloquent-Abfragen.
Zuletzt geändert am 13. Juli 2026