Фабрики и сиды
Пустую базу неудобно разрабатывать: не видно, как выглядит список из ста статей или страница с длинным именем. Фабрики и сиды создают правдоподобные данные одной командой — и у вас, и у каждого участника команды.
Фабрика
Фабрика описывает, как выглядит одна запись модели. Создаётся командой:
php artisan make:factory PostFactoryВ методе definition() задают значения столбцов. Функция fake() генерирует случайные, но похожие на настоящие данные:
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
public function definition(): array
{
return [
'title' => fake()->sentence(),
'body' => fake()->paragraphs(3, true),
'is_published' => fake()->boolean(80),
];
}
}Подключение к модели
Модель получает метод factory() через трейт HasFactory:
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
}Создание записей
$post = Post::factory()->create();
$posts = Post::factory()->count(20)->create();
$draft = Post::factory()->create(['is_published' => false]);Массив в create() переопределяет значения из фабрики. Метод make() создаёт объект, но не сохраняет его в базу.
Связанные записи
Фабрика умеет создавать и связанные модели:
$user = User::factory()
->has(Post::factory()->count(3))
->create();У пользователя появятся три статьи с правильным user_id.
Сид
Сид — класс, который наполняет базу. Главный сид лежит в database/seeders/DatabaseSeeder.php:
namespace Database\Seeders;
use App\Models\Post;
use App\Models\User;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
public function run(): void
{
User::factory()->create([
'name' => 'Admin',
'email' => 'admin@example.com',
]);
Post::factory()->count(50)->create();
}
}Запуск
php artisan db:seed
php artisan migrate:fresh --seedВторая команда удаляет все таблицы, выполняет миграции заново и сразу запускает сиды — так базу приводят в исходное состояние.
Частая ошибка
migrate:fresh стирает все данные. На рабочем сервере эту команду запускать нельзя: Laravel спросит подтверждение, но лучше не доводить до этого. Сиды со случайными данными — только для разработки и тестов.