第2.3章:数据库迁移
学习时间: 50分钟
1. 迁移:建造空间站
Laravel 中的迁移是您数据库的版本控制系统。
想象一下,您:
- 🏗️ 创建空间站蓝图(
create_planets_table
迁移) - 🚀 部署模块(运行迁移)
- 🔧 改造结构(新的迁移)
- ⏪ 可以回滚到旧版本(回滚)
💡 重要提示: 迁移使团队能够协调一致地工作——就像不同大陆的工程师建造国际空间站一样!
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
来查看。
使用控制台时:
无论如何,输出应该如下:
id | 名称 | 描述 | 大小(公里) | 太阳系 | 图片URL | 是否宜居 |
---|---|---|---|---|---|---|
1 | 地球 | 一颗拥有多样生命的蓝色星球 | 12742 | 太阳系 | ... | true |
2 | 火星 | 一颗红色星球,殖民目标 | 6779 | 太阳系 | null | false |
巩固测验
🚀 本章总结:
您已掌握“太空基础设施建设”:
- ✅ 创建并运行了迁移
- 🔧 改造了表结构
- 🌍 用第一批星球填充了数据库
- ⚙️ 学会了使用 PostgreSQL
您的宇宙拥有了第一批世界! 现在可以开始创建用于管理星球的 API 接口了。
📌 检查:
- 运行
php artisan tinker
- 执行
App\Models\Planet::all()
- 确认您能看到地球和火星