Сідери · Laravel
Вступ
Laravel дозволяє наповнювати базу даних тестовими даними за допомогою класів-сідерів. Усі класи сідерів зберігаються в каталозі database/seeders. За замовчуванням для вас визначено клас DatabaseSeeder. У ньому можна скористатися методом call, щоб запускати інші класи сідерів і контролювати порядок наповнення.
Примітка Захист від масового призначення автоматично вимикається під час наповнення бази даних.
Написання сідерів
Щоб згенерувати сідер, виконайте Artisan-команду make:seeder. Усі сідери, згенеровані фреймворком, потраплять у каталог database/seeders:
php artisan make:seeder UserSeeder
За замовчуванням клас сідера містить лише один метод: run. Цей метод викликається під час виконання Artisan-команди db:seed. Усередині методу run ви можете вставляти дані в базу як забажаєте. Для ручної вставки даних підійде конструктор запитів, або ж скористайтеся фабриками моделей Eloquent.
Наприклад, змінімо стандартний клас DatabaseSeeder і додаймо до методу 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
{
/**
* Запустити сідери бази даних.
*/
public function run(): void
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@example.com',
'password' => Hash::make('password'),
]);
}
}
Примітка У сигнатурі методу
runможна вказати через type-hint будь-які потрібні залежності. Вони автоматично будуть отримані через контейнер сервісів Laravel.
Використання фабрик моделей
Звісно, вручну задавати атрибути для кожної моделі незручно. Замість цього скористайтеся фабриками моделей, щоб зручно генерувати великі обсяги записів. Спершу перегляньте документацію про фабрики моделей, щоб дізнатися, як їх визначати.
Наприклад, створімо 50 користувачів, кожен із яких має один повʼязаний допис:
use App\Models\User;
/**
* Запустити сідери бази даних.
*/
public function run(): void
{
User::factory()
->count(50)
->hasPosts(1)
->create();
}
Виклик додаткових сідерів
У класі DatabaseSeeder можна використовувати метод call, щоб виконувати додаткові класи сідерів. Метод call дозволяє розбити наповнення бази на кілька файлів, аби жоден клас сідера не розростався надміру. Метод call приймає масив класів сідерів, які треба виконати:
/**
* Запустити сідери бази даних.
*/
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class,
CommentSeeder::class,
]);
}
Вимкнення подій моделей
Під час наповнення бази вам може знадобитися заборонити моделям надсилати події. Цього можна досягти за допомогою трейту WithoutModelEvents. Трейт WithoutModelEvents гарантує, що жодна подія моделі не буде надіслана, навіть якщо додаткові класи сідерів виконуються через метод call:
<?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,
]);
}
}
Запуск сідерів
Щоб наповнити базу даних, виконайте Artisan-команду db:seed. За замовчуванням команда db:seed запускає клас Database\Seeders\DatabaseSeeder, який своєю чергою може викликати інші класи сідерів. Проте за допомогою опції --class ви можете вказати конкретний клас сідера для окремого запуску:
php artisan db:seed
php artisan db:seed --class=UserSeeder
Наповнити базу даних також можна командою migrate:fresh разом з опцією --seed: вона видалить усі таблиці й повторно виконає всі міграції. Ця команда стане в пригоді для повної перебудови бази даних. Опція --seeder дозволяє вказати конкретний сідер для запуску:
php artisan migrate:fresh --seed
php artisan migrate:fresh --seed --seeder=UserSeeder
Примусовий запуск сідерів у продакшені
Деякі операції наповнення можуть змінити або знищити дані. Щоб захистити вас від запуску команд наповнення на продакшен-базі, у середовищі production перед виконанням сідерів буде запитано підтвердження. Щоб запустити сідери без запиту, скористайтеся прапорцем --force:
php artisan db:seed --force
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.