Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

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 - перестворити БД і засіяти.

Докладніше в документації: Seeding

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=....

Докладніше в документації: Запуск сідерів