Junior: питання на співбесіді з теми «Сидери»
Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.
2 питання
Seeding - це процес наповнення бази даних початковими або тестовими даними. Laravel робить це через класи-сідери, які лежать у директорії database/seeders. Зручно для довідників (країни, ролі), демо-контенту та локальної розробки чи тестів.
Створити сідер:
php artisan make:seeder PostSeeder
Логіку вставки описують у методі run() - або через фабрики, або напряму через Query Builder:
class PostSeeder extends Seeder
{
public function run(): void
{
Post::factory()->count(50)->create(); // через фабрику
// або напряму
DB::table('roles')->insert([
['name' => 'admin'],
['name' => 'user'],
]);
}
}
Реєстрація: сідери викликають у DatabaseSeeder::run(), щоб запускати їх разом:
public function run(): void
{
$this->call([RoleSeeder::class, PostSeeder::class]);
}
Запуск:
php artisan db:seed- виконуєDatabaseSeeder.php artisan db:seed --class=PostSeeder- конкретний сідер.php artisan migrate:fresh --seed- перестворити БД і засіяти.
php artisan db:seed # DatabaseSeeder
php artisan db:seed --class=UserSeeder # один конкретний
php artisan migrate:fresh --seed # перебудувати базу й наповнити
DatabaseSeeder - точка входу. Він викликає інші сідери в потрібному порядку:
class DatabaseSeeder extends Seeder
{
public function run(): void
{
$this->call([
UserSeeder::class,
PostSeeder::class, // після користувачів - пости мають авторів
]);
}
}
Новий сідер створює php artisan make:seeder UserSeeder, і його треба додати в call(), інакше db:seed без --class його не запустить.
На продакшені команда питає підтвердження; у скриптах деплою додають --force. Але сідери з тестовими даними там не запускають узагалі - лише ідемпотентні довідники.
migrate:fresh видаляє всі таблиці - для локальної бази з даними, які шкода втратити, краще окремий db:seed --class=....