Skip to content

第2.3章:数据库迁移

学习时间: 50分钟


1. 迁移:建造空间站

Laravel 中的迁移是您数据库的版本控制系统。

想象一下,您:

  1. 🏗️ 创建空间站蓝图(create_planets_table 迁移)
  2. 🚀 部署模块(运行迁移)
  3. 🔧 改造结构(新的迁移)
  4. ⏪ 可以回滚到旧版本(回滚)

💡 重要提示: 迁移使团队能够协调一致地工作——就像不同大陆的工程师建造国际空间站一样!


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 名称 描述 大小(公里) 太阳系 图片URL 是否宜居
1 地球 一颗拥有多样生命的蓝色星球 12742 太阳系 ... true
2 火星 一颗红色星球,殖民目标 6779 太阳系 null false

巩固测验

1. 运行迁移的命令:

2. 如何回滚最后一次迁移?

3. 数据填充器用于:

4. 在现有表中添加列的方法:

5. 数据填充器在哪里注册?


🚀 本章总结:

您已掌握“太空基础设施建设”:

  • ✅ 创建并运行了迁移
  • 🔧 改造了表结构
  • 🌍 用第一批星球填充了数据库
  • ⚙️ 学会了使用 PostgreSQL

您的宇宙拥有了第一批世界! 现在可以开始创建用于管理星球的 API 接口了。

📌 检查:

  1. 运行 php artisan tinker
  2. 执行 App\Models\Planet::all()
  3. 确认您能看到地球和火星