Skip to content

Глава 2.3: Миграции базы данных

Время изучения: 50 минут


1. Миграции: Строительство космической станции

Миграции в Laravel — это система контроля версий для вашей базы данных.

Представьте, что вы:

  1. 🏗️ Создаете чертеж станции (миграция create_planets_table)
  2. 🚀 Развертываете модули (запуск миграций)
  3. 🔧 Модернизируете конструкцию (новые миграции)
  4. ⏪ Можете откатиться к прошлой версии (rollback)

💡 Важно: Миграции позволяют команде работать согласованно — как инженеры на разных континентах, строящие МКС!


2. Запуск миграций

После создания миграции в главе 2.2 выполните:

php artisan migrate

Вывод в терминале:

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (25.12ms)
Migrating: 2014_10_12_100000_create_password_reset_tokens_table
Migrated:  2014_10_12_100000_create_password_reset_tokens_table (18.07ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (21.33ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (30.45ms)
Migrating: 2025_08_04_000000_create_planets_table
Migrated:  2025_08_04_000000_create_planets_table (15.67ms)  # Ваша таблица!

Проверка в pgAdmin 4:

  1. Откройте базу space_api → Schemas → Tables
  2. Убедитесь, что появились: - planets - users - password_reset_tokens

3. Откат миграций: Аварийное возвращение

Если нужно исправить структуру:

php artisan migrate:rollback  # Откат последнего пакета миграций
php artisan migrate:reset    # Полный откат всех миграций

  • php artisan migrate:freshсамая полезная команда в разработке! Она удаляет все таблицы и заново выполняет все миграции.
  • php artisan migrate:fresh --seed — делает то же самое, что и fresh, но после миграций сразу запускает сидеры. Это команда для полного "пересоздания" базы данных с нуля.

Сценарий использования:

# Шаг 1: Поняли, что в миграции ошибка. Полностью пересоздаем базу.
php artisan migrate:fresh
# Шаг 2: Редактируем миграцию
# Шаг 3: Снова пересоздаем базу с уже исправленной миграцией
php artisan migrate:fresh


4. Добавление новых полей: Модернизация станции

Пример: Добавим поле is_habitable (обитаема ли планета).

Шаг 1: Создаем новую миграцию

php artisan make:migration add_is_habitable_to_planets_table

Шаг 2: Редактируем файл database/migrations/..._add_is_habitable_to_planets_table.php

<?php
public function up()
{
    Schema::table('planets', function (Blueprint $table) {
        $table->boolean('is_habitable')
              ->default(false);
    });
}

public function down()
{
    Schema::table('planets', function (Blueprint $table) {
        $table->dropColumn('is_habitable');
    });
}

Шаг 3: Запускаем обновление

php artisan migrate


5. Наполнение базы: Первые планеты

Создаем сидер (Seeder) — скрипт для генерации тестовых данных.

Шаг 1: Генерация сидера

php artisan make:seeder PlanetSeeder

Шаг 2: Редактируем database/seeders/PlanetSeeder.php

<?php
use App\Models\Planet; // Импортируем модель планеты - Без него словишь ошибку!


class PlanetSeeder extends Seeder
{
    public function run()
    {
        Planet::create([
            'name' => 'Земля',
            'description' => 'Голубая планета с разнообразной жизнью',
            'size_km' => 12742,
            'solar_system' => 'Солнечная система',
            'image_url' => 'https://example.com/earth.jpg',
            'is_habitable' => true
        ]);

        Planet::create([
            'name' => 'Марс',
            'description' => 'Красная планета, цель будущих колонизаций',
            'size_km' => 6779,
            'solar_system' => 'Солнечная система',
            'is_habitable' => false
        ]);
    }
}

Шаг 3: Регистрируем сидер в database/seeders/DatabaseSeeder.php

<?php
public function run()
{
    $this->call([
        PlanetSeeder::class
    ]);
}

Шаг 4: Запуск наполнения

php artisan db:seed


6. Работа с PostgreSQL: Специфика

Особенности типа данных:

Возможность PostgreSQL MySQL Комментарий Laravel
Логический тип boolean (настоящий true/false) tinyint(1) (хранит 0/1) $table->boolean('...') работает для обоих
JSON jsonb (бинарный, индексируемый) json (текстовый) $table->jsonb('...') - очень мощно в PG
Массивы text[], integer[] (нативные массивы) Нет (эмулируется через JSON или строки) $table->array('...') (эксклюзив для PG)
Порядок колонок Нельзя управлять (after() не работает) Можно управлять (after()) Laravel абстрагирует это, но нужно знать об ограничении

Пример создания индекса:

// В миграции
$table->index('solar_system');


7. Проверка данных в psql

Вы можете воспользоваться любым графическим клиентом и выбрать там space_api для просмотра.

При использовании консоли:

psql -U postgres -d space_api
# Терминал может запросить пароль, который вы задали при установке PostgreSQL.
SELECT * FROM planets;

В любом случае вывод должен быть следующим:

id name description size_km solar_system image_url is_habitable
1 Земля Голубая планета с разнообразной жизнью 12742 Солнечная система ... true
2 Марс Красная планета, цель колонизаций 6779 Солнечная система null false

Квиз для закрепления

1. Команда для запуска миграций:

2. Как откатить последнюю миграцию?

3. Сидеры используются для:

4. Метод для добавления столбца в существующую таблицу:

5. Где регистрируются сидеры?


🚀 Итог главы:

Вы освоили "строительство космической инфраструктуры":

  • ✅ Создали и запустили миграции
  • 🔧 Модернизировали структуру таблицы
  • 🌍 Заполнили БД первыми планетами
  • ⚙️ Научились работать с PostgreSQL

Ваша вселенная обрела первые миры! Теперь можно переходить к созданию API-интерфейсов для управления планетами.

📌 Проверка:

  1. Запустите php artisan tinker
  2. Выполните App\Models\Planet::all()
  3. Убедитесь, что видите Землю и Марс