Урок 5: Миграции и базы данных в Laravel

На пятом уроке мы разберем одну из возможностей Laravel, это работу с базами данных через миграции и сидеры. Если вы только начинаете свой путь в веб-разработке, этот урок станет вашим надежным проводником. Мы научимся настраивать подключение к БД, создавать миграции, управлять ими и наполнять таблицы тестовыми данными.

Настройка подключения к БД

Перед началом работы с базой данных в Laravel нужно правильно настроить подключение. Для этого используется файл .env, расположенный в корне проекта. Этот файл содержит конфигурации окружения, включая параметры БД.

Шаг 1: Открываем файл .env

Найдите в проекте файл .env. Он выглядит примерно так:

env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

Шаг 2: Настраиваем параметры

  • DB_CONNECTION — тип СУБД (mysql, pgsql, sqlite).
  • DB_HOST — адрес сервера (обычно 127.0.0.1 для локальной разработки).
  • DB_PORT — порт (для MySQL — 3306).
  • DB_DATABASE — имя вашей базы данных.
  • DB_USERNAME и DB_PASSWORD — логин и пароль для доступа.

Пример для SQLite:
Если вы хотите использовать SQLite, удалите другие DB-параметры и укажите:

env
DB_CONNECTION=sqlite
# Уберите комментарий с этой строки:
# DB_DATABASE=database/database.sqlite

Создайте файл database/database.sqlite и запустите php artisan migrate.

Проверка подключения

Чтобы убедиться, что всё работает, выполните:

bash
php artisan db:show

Если видите список таблиц — подключение успешно!

Создание и редактирование миграций

Миграции это «версионирование» структуры базы данных. Они позволяют легко создавать, изменять и откатывать таблицы.

Генерация миграции

Создайте миграцию для таблицы posts:

bash
php artisan make:migration create_posts_table

Файл появится в папке database/migrations. Откройте его.

Структура миграции

В методе up() описываем создание таблицы, в down() — её удаление:

php
public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id(); // Автоинкрементный первичный ключ
        $table->string('title'); // Строка (VARCHAR)
        $table->text('content'); // Текст (TEXT)
        $table->timestamps(); // created_at и updated_at
    });
}

public function down(): void
{
    Schema::dropIfExists('posts');
}

Добавление полей

Допустим, мы хотим добавить колонку author_id. Создайте новую миграцию:

bash
php artisan make:migration add_author_id_to_posts_table

В методе up():

php
public function up(): void
{
    Schema::table('posts', function (Blueprint $table) {
        $table->foreignId('author_id')->constrained('users');
    });
}

Метод constrained('users') автоматически создаст внешний ключ на таблицу users.

Запуск миграций и откат

Запуск всех миграций

bash
php artisan migrate

Laravel выполнит все миграции, которые ещё не были применены.

Откат последней миграции

bash
php artisan migrate:rollback

Это отменит последний пакет миграций (обычно последний migrate).

Полный сброс

bash
php artisan migrate:reset

Удалит все таблицы. Используйте осторожно!

Наполнение таблиц через Seeders

Сидеры (Seeders) позволяют заполнить базу тестовыми данными.

Создание сидера

bash
php artisan make:seeder PostSeeder

Откройте файл database/seeders/PostSeeder.php:

php
public function run(): void
{
    DB::table('posts')->insert([
        'title' => 'Мой первый пост',
        'content' => 'Это содержимое поста...',
        'author_id' => 1,
        'created_at' => now(),
        'updated_at' => now(),
    ]);
}

Использование фабрик

Для генерации большого количества данных удобно использовать фабрики. Создайте фабрику для модели Post:

bash
php artisan make:factory PostFactory --model=Post

Пример PostFactory.php:

php
public function definition(): array
{
    return [
        'title' => fake()->sentence(),
        'content' => fake()->text(500),
        'author_id' => User::inRandomOrder()->first()->id,
    ];
}

Теперь в сидере можно вызвать:

php
Post::factory()->count(50)->create();

Запуск сидеров

bash
php artisan db:seed --class=PostSeeder

Или через DatabaseSeeder:

php
public function run(): void
{
    $this->call([
        PostSeeder::class,
    ]);
}

И выполните:

bash
php artisan db:seed

Практические задачи

  1. Настройте SQLite:
    • Создайте файл database/database.sqlite.
    • Измените .env для работы с SQLite.
    • Запустите миграции.
  2. Создайте миграцию для таблицы comments:
    • Поля: idpost_id (внешний ключ), textcreated_at.
    • Добавьте индекс для post_id.
  3. Наполните таблицу comments через сидер:
    • Используйте фабрику для генерации 100 комментариев.
  4. Откатите миграции и запустите заново:
    bash
    php artisan migrate:fresh --seed

Теперь вы умеете работать с базами данных в Laravel как настоящий профессионал. Миграции и сидеры это мощные инструменты, которые избавят вас от рутины. Если хотите глубже погрузиться в Laravel, присоединяйтесь к моему полному курсу: Laravel для начинающих. Там вас ждут 20 уроков с практикой, поддержкой.