Vai al contenuto principale

Cos’è il seeding

Il seeding è il meccanismo per inserire nel database dati di esempio o dati iniziali. Nella configurazione di ambienti di sviluppo e nei test automatici serve avere dati già presenti. Poiché inserire manualmente i dati ogni volta è oneroso, si raccolgono in seeder eseguibili ripetutamente. Le classi seeder si trovano nella directory database/seeders. Di default è già presente la classe DatabaseSeeder.

Creazione di un seeder

Genera una nuova classe seeder con il comando Artisan make:seeder.
php artisan make:seeder UserSeeder
Il file generato viene collocato in database/seeders/UserSeeder.php.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Esegue il seeder
     */
    public function run(): void
    {
        // Qui scrivi la logica di inserimento dei dati
    }
}

Implementazione del seeder

Scrivi la logica di inserimento dei dati all’interno del metodo run(). Puoi usare la facade DB oppure i modelli Eloquent.

Usando la facade DB

<?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' => 'Mario Rossi',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
                'created_at' => now(),
                'updated_at' => now(),
            ],
            [
                'name' => 'Giulia Bianchi',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
                'created_at' => now(),
                'updated_at' => now(),
            ],
        ]);
    }
}

Usando i modelli Eloquent

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

public function run(): void
{
    User::create([
        'name' => 'Amministratore',
        'email' => '[email protected]',
        'password' => Hash::make('password'),
    ]);
}
Durante l’esecuzione del seeding la protezione da mass assignment viene disabilitata automaticamente. Puoi inserire dati senza preoccuparti delle impostazioni di $fillable o $guarded.

Combinazione con le model factory

Quando servono grandi quantità di dati di test, è utile combinare i seeder con le model factory. Con le factory puoi generare in blocco dati fittizi casuali.
use App\Models\User;
use App\Models\Post;

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

    // Crea 3 post per ciascun utente
    User::factory(5)
        ->hasPosts(3)
        ->create();
}
Per i dettagli sull’uso delle factory consulta la documentazione delle factory Eloquent.

Come usare DatabaseSeeder

DatabaseSeeder è il punto di ingresso per gestire in modo unificato più seeder. Con il metodo call() specifichi quali seeder eseguire.
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run(): void
    {
        $this->call([
            UserSeeder::class,
            PostSeeder::class,
            CommentSeeder::class,
        ]);
    }
}
I seeder vengono eseguiti nell’ordine passato a call(). In presenza di vincoli di chiave esterna, ordina in modo da seedare prima le tabelle referenziate (ad esempio usersposts).

Esecuzione dei seeder

Eseguire tutti i seeder

php artisan db:seed
Viene invocato DatabaseSeeder e, da lì, vengono eseguiti in ordine i seeder specificati con call().

Eseguire solo un seeder specifico

Con l’opzione --class puoi specificare la classe seeder da eseguire.
php artisan db:seed --class=UserSeeder

Esecuzione insieme alle migration

Aggiungendo l’opzione --seed al comando migrate:fresh, puoi ricreare tutte le tabelle e poi eseguire in blocco il seeding.
php artisan migrate:fresh --seed
Se vuoi eseguire solo un seeder specifico usa l’opzione --seeder.
php artisan migrate:fresh --seed --seeder=UserSeeder
migrate:fresh elimina e ricrea tutte le tabelle. Tutti i dati esistenti andranno persi, quindi non usarlo in produzione.

Esecuzione in produzione

Se provi a eseguire il seeding in produzione viene mostrato un prompt di conferma. Per eseguirlo senza conferma usa il flag --force.
php artisan db:seed --force
Il seeding in produzione può causare sovrascritture o perdite di dati. Esegui sempre un backup prima di procedere.

Soppressione degli eventi del modello

Se vuoi impedire che durante il seeding vengano emessi eventi del modello (creating, created, ecc.), usa il 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,
        ]);
    }
}
Si applica anche ai seeder figli eseguiti tramite call().

Esempio pratico: seeder per un’app blog

Esempio di configurazione dei dati iniziali per un’applicazione blog con utenti e post.
// 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
    {
        // Crea da 2 a 5 post per ciascun utente
        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, // eseguito dopo users
        ]);
    }
}
Passi di esecuzione:
php artisan migrate:fresh --seed

Prossimi passi

Introduzione a Eloquent

Impara a recuperare e manipolare con Eloquent ORM i dati inseriti tramite i seeder.
Ultima modifica il 13 luglio 2026