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.
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.
<?phpnamespace 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 }}
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.
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.
DatabaseSeeder è il punto di ingresso per gestire in modo unificato più seeder. Con il metodo call() specifichi quali seeder eseguire.
<?phpnamespace 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 users → posts).