Довідники - ролі, статуси, категорії, налаштування - це дані застосунку, а не демо. Вони потрібні на проді, і сідер для них має витримувати повторний запуск.
Не так:
Role::create(['slug' => 'admin', 'name' => 'Адміністратор']);
Другий запуск або впаде на унікальному індексі, або створить дубль.
Так:
foreach ([
['slug' => 'admin', 'name' => 'Адміністратор'],
['slug' => 'editor', 'name' => 'Редактор'],
] as $role) {
Role::updateOrCreate(['slug' => $role['slug']], $role);
}
Ключ пошуку - стабільний ідентифікатор, а не id: автоінкремент на різних середовищах різний.
Обережно з updateOrCreate на довідниках, які редагують з адмінки. Він перезапише зміни, зроблені руками. Якщо назву дозволено міняти, оновлювати варто лише технічні поля:
Role::firstOrCreate(['slug' => 'editor'], ['name' => 'Редактор']);
firstOrCreate створює запис, якщо його немає, і не чіпає наявний.
Як запускати на проді:
php artisan db:seed --class=RolesSeeder --force
--force потрібен, бо в продакшн-середовищі Artisan питає підтвердження. Викликати db:seed без --class на проді небезпечно: DatabaseSeeder зазвичай тягне ще й демо-дані.
Альтернатива - зробити це міграцією. Тоді заповнення виконається рівно один раз і саме в потрібний момент деплою, а не за окремою командою, яку легко забути. Для довідника, від якого залежить код нового випуску, це надійніше.