В этой статье мы подробно разберём, как в Laravel 12 создавать и автоматически заполнять связанные таблицы в базе данных, когда один родительский объект связан с несколькими дочерними. Такое часто встречается в блогах, магазинах и любом приложении, где один объект (например, категория) может иметь много связанных записей (например, постов).
Что такое отношение один-ко-многим в Laravel
Отношение один-ко-многим означает, что одна запись связана сразу с несколькими записями другой таблицы. Классические примеры:
Один пользователь - много постов
Одна категория - много продуктов
Один автор - много статей
Схема работает так: родительская таблица имеет первичный ключ id, а дочерняя содержит внешний ключ (category_id или user_id), который ссылается на родителя. В Laravel это реализуется через методы hasMany() и belongsTo().
Шаг 1. Установка Laravel
Для начала создадим свежий проект Laravel (если он ещё не установлен):
composer create-project laravel/laravel laravel-seeder-exampleЭта команда создаст новую папку с файлам проекта и самой последней версией Laravel.
Шаг 2. Генерация моделей и миграций
Для примера будем использовать модели Category (родитель) и Post (дочерняя запись). Категория может иметь много постов.
Создаём модель и миграцию для категорий:
php artisan make:model Category -mОткрой сгенерированный файл миграции create_categories_table.php и обнови его так:
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->boolean('status')->default(true);
$table->timestamps();
});Создаём модель и миграцию для постов:
php artisan make:model Post -mВ миграции create_posts_table.php добавь внешний ключ:
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('category_id');
$table->foreign('category_id')->references('id')->on('categories');
$table->string('title');
$table->text('content')->nullable();
$table->timestamps();
});Запускаем миграции
Теперь применим миграции, чтобы создать таблицы:
php artisan migrateШаг 3. Определяем отношения в моделях
Laravel требует явно указать связи между моделями.
Модель Category
Открой app/Models/Category.php и добавь метод:
public function posts()
{
return $this->hasMany(Post::class);
}Это позволяет обращаться к постам категории как $category->posts.
Модель Post
В файле app/Models/Post.php добавь:
public function category()
{
return $this->belongsTo(Category::class);
}Так пост знает, к какой категории он принадлежит.
Шаг 4. Настройка фабрик для тестовых данных
Фабрики нужны, чтобы автоматически генерировать реалистичные записи.
CategoryFactory
Создай фабрику:
php artisan make:factory CategoryFactoryВнутри файла database/factories/CategoryFactory.php определи генерацию:
return [
'name' => fake()->name(),
'status' => fake()->boolean(),
];PostFactory
Создай фабрику для постов:
php artisan make:factory PostFactoryВ database/factories/PostFactory.php добавь:
return [
'title' => fake()->sentence(),
'content' => fake()->paragraph(),
'category_id' => Category::factory()
];Это позволит создавать посты, которые автоматически привязаны к категории через фабрику.
Шаг 5. Сидер с отношением один-ко-многим
Создаём сидер:
php artisan make:seeder CategoryPostSeederОткрой файл database/seeders/CategoryPostSeeder.php и вставь:
public function run(): void
{
Category::factory()
->count(10)
->hasPosts(2) // для каждой категории по 2 поста
->create();
}Этот код создаст 10 категорий, и у каждой по 2 поста.
Шаг 6. Регистрация сидера
Открой главный сидер DatabaseSeeder.php и добавь:
$this->call([
CategoryPostSeeder::class,
]);Теперь Laravel будет выполнять наш сидер при запуске.
Шаг 7. Запуск сидеров
Запусти команду:
php artisan db:seedПосле выполнения в базе появится:
10 категорий
По 2 поста для каждой
Итого 20 связанных записей
В Laravel 12 легко настраивать и автоматически заполнять связанные таблицы с отношениями один-ко-многим, используя миграции, Eloquent-модели, фабрики и сидеры. Это помогает ускорить разработку, тестирование и наполнить приложение реалистичными данными на старте.