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
Lascia un commento

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *