Laravel 12: Seeder отношения один-ко-многим

В этой статье мы подробно разберём, как в 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-модели, фабрики и сидеры. Это помогает ускорить разработку, тестирование и наполнить приложение реалистичными данными на старте.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Как установить Docker и Docker Compose на Ubuntu и RedHat системы (2025)

Подробная инструкция по установке Docker и Docker Compose на Debian-based и RedHat-based системы. Разбор всех команд по шагам, настройка GPG-ключей, добавление репозиториев, запуск сервиса, проверка и устранение типичных ошибок.

144 0 2 мин

Как работает time.sleep() в Python

Подробно разбираем функцию time.sleep() в Python: как она работает, где применяется и какие ограничения имеет. Рассмотрены практические примеры, использование в циклах, многопоточном и асинхронном коде.

12 0 1 мин

Простой способ работать с конкурентностью и параллелизмом в Python

Объяснение, как с помощью стандартных средств Python (concurrent.futures) легко решать задачи конкурентности и параллелизма. Приведены практические примеры использования пулов потоков и процессов.

41 0 2 мин