Глава 2.3: Миграции базы данных
Время изучения: 50 минут
1. Миграции: Строительство космической станции
Миграции в Laravel — это система контроля версий для вашей базы данных.
Представьте, что вы:
- 🏗️ Создаете чертеж станции (миграция
create_planets_table
) - 🚀 Развертываете модули (запуск миграций)
- 🔧 Модернизируете конструкцию (новые миграции)
- ⏪ Можете откатиться к прошлой версии (rollback)
💡 Важно: Миграции позволяют команде работать согласованно — как инженеры на разных континентах, строящие МКС!
2. Запуск миграций
После создания миграции в главе 2.2 выполните:
Вывод в терминале:
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:
- Откройте базу
space_api
→ Schemas → Tables - Убедитесь, что появились: -
planets
-users
-password_reset_tokens
3. Откат миграций: Аварийное возвращение
Если нужно исправить структуру:
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: Создаем новую миграцию
Шаг 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: Запускаем обновление
5. Наполнение базы: Первые планеты
Создаем сидер (Seeder) — скрипт для генерации тестовых данных.
Шаг 1: Генерация сидера
Шаг 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
Шаг 4: Запуск наполнения
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 абстрагирует это, но нужно знать об ограничении |
Пример создания индекса:
7. Проверка данных в psql
Вы можете воспользоваться любым графическим клиентом и выбрать там space_api для просмотра.
При использовании консоли:
psql -U postgres -d space_api
# Терминал может запросить пароль, который вы задали при установке PostgreSQL.
В любом случае вывод должен быть следующим:
id | name | description | size_km | solar_system | image_url | is_habitable |
---|---|---|---|---|---|---|
1 | Земля | Голубая планета с разнообразной жизнью | 12742 | Солнечная система | ... | true |
2 | Марс | Красная планета, цель колонизаций | 6779 | Солнечная система | null | false |
Квиз для закрепления
🚀 Итог главы:
Вы освоили "строительство космической инфраструктуры":
- ✅ Создали и запустили миграции
- 🔧 Модернизировали структуру таблицы
- 🌍 Заполнили БД первыми планетами
- ⚙️ Научились работать с PostgreSQL
Ваша вселенная обрела первые миры! Теперь можно переходить к созданию API-интерфейсов для управления планетами.
📌 Проверка:
- Запустите
php artisan tinker
- Выполните
App\Models\Planet::all()
- Убедитесь, что видите Землю и Марс