Laravel zawiera możliwość wypełniania bazy danych danymi za pomocą klas seed. Wszystkie klasy seed są przechowywane w katalogu database/seeders. Domyślnie zdefiniowana jest dla Ciebie klasa DatabaseSeeder. Z tej klasy możesz użyć metody call, aby uruchomić inne klasy seed, co pozwala kontrolować kolejność seedowania.
Note
Ochrona przed masowym przypisaniem jest automatycznie wyłączana podczas seedowania bazy danych.
Aby wygenerować seeder, wykonaj polecenie Artisan make:seeder. Wszystkie seedery wygenerowane przez framework zostaną umieszczone w katalogu database/seeders:
php artisan make:seeder UserSeederKlasa seedera domyślnie zawiera tylko jedną metodę: run. Ta metoda jest wywoływana, gdy wykonywane jest polecenie Artisan db:seed. W metodzie run możesz wstawiać dane do swojej bazy danych w dowolny sposób. Możesz użyć konstruktora zapytań do ręcznego wstawiania danych lub możesz użyć fabryk modeli Eloquent.
Jako przykład zmodyfikujmy domyślną klasę DatabaseSeeder i dodajmy instrukcję wstawiania do bazy danych do metody 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
{
/**
* Run the database seeders.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}Note
Możesz określić type-hint dla dowolnych zależności, których potrzebujesz w sygnaturze metody run. Będą one automatycznie rozwiązane przez kontener usług Laravel.
Oczywiście ręczne określanie atrybutów dla każdego seedu modelu jest uciążliwe. Zamiast tego możesz użyć fabryk modeli, aby wygodnie wygenerować duże ilości rekordów bazy danych. Najpierw przejrzyj dokumentację fabryk modeli, aby dowiedzieć się, jak definiować swoje fabryki.
Na przykład stwórzmy 50 użytkowników, z których każdy ma jeden powiązany post:
use App\Models\User;
/**
* Run the database seeders.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}W klasie DatabaseSeeder możesz użyć metody call, aby wykonać dodatkowe klasy seed. Użycie metody call pozwala podzielić seedowanie bazy danych na wiele plików, tak aby żadna pojedyncza klasa seedera nie stała się zbyt duża. Metoda call akceptuje tablicę klas seedera, które powinny zostać wykonane:
/**
* Run the database seeders.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}Podczas uruchamiania seedów możesz chcieć zapobiec wysyłaniu zdarzeń przez modele. Możesz to osiągnąć, używając traitu WithoutModelEvents. Gdy jest używany, trait WithoutModelEvents zapewnia, że żadne zdarzenia modelu nie są wysyłane, nawet jeśli dodatkowe klasy seed są wykonywane za pomocą metody 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,
]);
}
}Możesz wykonać polecenie Artisan db:seed, aby zaseedować bazę danych. Domyślnie polecenie db:seed uruchamia klasę Database\Seeders\DatabaseSeeder, która z kolei może wywoływać inne klasy seed. Możesz jednak użyć opcji --class, aby określić konkretną klasę seedera do uruchomienia indywidualnie:
php artisan db:seed
php artisan db:seed --class=UserSeederMożesz również zaseedować bazę danych za pomocą polecenia migrate:fresh w połączeniu z opcją --seed, co usunie wszystkie tabele i ponownie uruchomi wszystkie Twoje migracje. To polecenie jest przydatne do całkowitego przebudowania bazy danych. Opcja --seeder może być użyta do określenia konkretnego seedera do uruchomienia:
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeederNiektóre operacje seedowania mogą spowodować zmianę lub utratę danych. Aby chronić Cię przed uruchamianiem poleceń seedowania na Twojej produkcyjnej bazie danych, zostaniesz poproszony o potwierdzenie, zanim seedery zostaną wykonane w środowisku production. Aby wymusić uruchomienie seederów bez monitu, użyj flagi --force:
php artisan db:seed --force