Prologo
Primi Passi
Architettura
Le Basi
- Routing
- Middleware
- Protezione da CSRF
- Controller
- Richieste
- Risposte
- Views
- Blade
- Vite
- URL
- Sessioni
- Validazione
- Errori
- Logging
Approfondimenti
- Artisan
- Broadcasting
- Cache
- Collezioni
- Concorrenza
- Contesto
- Contratti
- Eventi
- File System
- Helpers
- Client HTTP
- Localizzazione
- Notifiche
- Sviluppo di Package
- Processi
- Code
- Rate-limiting
- Stringhe
- Scheduling di Task
Sicurezza
Database
Eloquent ORM
Testing
Package
Seeding
Introduzione
Laravel include la possibilità di popolare il tuo database con dati utilizzando le seed classes. Tutte le seed classes sono memorizzate nella directory database/seeders
. Per impostazione predefinita, viene definita una classe DatabaseSeeder
per te. Da questa classe, puoi utilizzare il metodo call
per eseguire altre seed classes, permettendoti di controllare l’ordine di popolamento.
La mass assignment protection è automaticamente disabilitata durante il popolamento del database.
<a name="scrivere-seeders"></a>
## Scrivere Seeders
Per generare un seeder, esegui il comando `make:seeder` [Artisan command](https://laravel-italia.it/documentazione-laravel-11-x-artisan). Tutti i seeders generati dal framework saranno collocati nella directory `database/seeders`:
```shell
php artisan make:seeder UserSeeder
Una classe seeder contiene solo un metodo di default: run
. Questo metodo viene chiamato quando viene eseguito il comando db:seed
Artisan command. All’interno del metodo run
, puoi inserire dati nel tuo database come preferisci. Puoi utilizzare il query builder per inserire manualmente i dati oppure puoi usare le Eloquent model factories.
Ad esempio, modifichiamo la classe DatabaseSeeder
predefinita e aggiungiamo un’istruzione di inserimento nel database al metodo run
:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
/**
* Esegui i seeders del database.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
Puoi specificare qualsiasi dipendenza necessaria nella firma del metodo
run
. Verranno risolte automaticamente tramite il service container di Laravel.
Utilizzo delle Model Factories
Certo, specificare manualmente gli attributi per ogni seed del modello è laborioso. Invece, puoi usare le model factories per generare facilmente grandi quantità di record nel database. Innanzitutto, consulta la documentazione delle model factories per imparare a definire le tue factories.
Ad esempio, creiamo 50 utenti, ognuno con un post correlato:
use App\Models\User;
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
Chiamare Seeder Aggiuntivi
All’interno della classe DatabaseSeeder
, puoi usare il metodo call
per eseguire altre classi di seeder. Utilizzare il metodo call
ti permette di suddividere il seeding del database in più file, in modo che nessuna singola classe di seeder diventi troppo grande. Il metodo call
accetta un array di classi di seeder che devono essere eseguite:
/**
* Esegui i seeder del database.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
Disattivare gli Eventi del Modello
Durante l’esecuzione dei seed, potresti voler impedire ai modelli di emettere eventi. Puoi raggiungere questo obiettivo utilizzando il trait WithoutModelEvents
. Quando viene utilizzato, il trait WithoutModelEvents
garantisce che nessun evento del modello venga emesso, anche se vengono eseguite classi seed aggiuntive tramite il metodo call
:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
class DatabaseSeeder extends Seeder
{
use WithoutModelEvents;
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
]);
}
}
Eseguire i Seeders
Puoi eseguire il comando Artisan db:seed
per popolare il tuo database. Di default, il comando db:seed
esegue la classe Database\Seeders\DatabaseSeeder
, che può a sua volta invocare altre classi di seed. Tuttavia, puoi usare l’opzione --class
per specificare una classe seeder particolare da eseguire singolarmente:
php artisan db:seed
php artisan db:seed --class=UserSeeder
Puoi anche popolare il tuo database usando il comando migrate:fresh
insieme all’opzione --seed
, che eliminerà tutte le tabelle e rieseguirà tutte le migration. Questo comando è utile per ricostruire completamente il tuo database. L’opzione --seeder
può essere usata per specificare un seeder particolare da eseguire:
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder
Forzare l’Esecuzione dei Seeders in Produzione
Alcune operazioni di seeding possono causare la modifica o la perdita di dati. Per proteggerti dall’esecuzione di comandi di seeding sul tuo database di produzione, verrà richiesta una conferma prima che i seeders vengano eseguiti nell’ambiente production
. Per forzare l’esecuzione dei seeders senza prompt, usa l’opzione --force
:
php artisan db:seed --force