Laravel Migrations是数据库版本控制工具,通过代码管理结构变更。它在多环境部署中确保数据库一致性,团队协作时结合Git实现变更追踪与同步;支持up()/down()方法执行和回滚迁移,提供migrate:rollback、migrate:reset、migrate:refresh等命令应对错误;可处理表结构、索引、外键、列修改(需doctrine/dbal),并支持通过DB::statement操作视图、存储过程等高级功能,配合seeders填充数据,实现安全、可追溯、易协作的数据库管理。

Laravel Migrations,说白了,就是把数据库的结构变更用代码的形式管理起来,并且能像版本控制一样追踪、回滚。它让数据库的增删改查不再是手动操作,而是通过一个个脚本文件来执行,这样无论是团队协作还是多环境部署,都能确保数据库结构的一致性,省去了不少麻烦。在我看来,这玩意儿就是数据库的“Git”,每次改动都有迹可循,出错也能快速回到上一个稳定状态。
Laravel Migrations 的核心在于它提供了一套优雅的API来操作数据库 Schema。当你需要修改数据库结构时,比如新增一张表、添加一个字段,或者修改某个字段的类型,你不需要直接去数据库客户端操作。
首先,你需要创建一个新的迁移文件:
php artisan make:migration create_users_table --create=users # 或者修改现有表 php artisan make:migration add_email_to_users_table --table=users
这会在 database/migrations 目录下生成一个时间戳开头的文件,里面包含了 up() 和 down() 两个方法。up() 方法定义了你想要进行的数据库变更,比如创建表、添加列;而 down() 方法则定义了如何撤销这些变更,通常是删除表或删除列。
举个例子,创建一个 users 表的迁移文件可能会是这样:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('users');
}
};当你准备好执行这些变更时,运行:
php artisan migrate
Laravel 会扫描所有未执行的迁移文件,并按照时间戳顺序执行它们的 up() 方法。同时,它会在数据库中创建一个 migrations 表,记录哪些迁移文件已经被执行过,这正是版本控制的基础。
如果需要撤销最近一次或某批次的迁移,可以使用:
php artisan migrate:rollback
这会执行最新批次迁移文件的 down() 方法。如果想回滚所有迁移,可以使用 php artisan migrate:reset。而 php artisan migrate:refresh 则会先回滚所有迁移,然后重新执行所有迁移,这在开发过程中清理数据库结构非常有用。
在我个人经验里,Migrations 在多环境部署和团队协作中简直是救命稻草。想象一下,一个团队里有五六个人同时开发,每个人都可能需要改动数据库结构。如果没有 Migrations,那简直是一场灾难:谁改了什么、什么时候改的、怎么同步到其他人那里?想想都头大。
多环境部署:
在开发、测试、生产环境,数据库结构必须保持一致。Migrations 确保了这一点。每次部署到新环境或更新现有环境时,只需要运行 php artisan migrate --force(生产环境务必加 --force,否则会提示你确认),Laravel 就会自动把数据库更新到最新的结构。这比手动导入 SQL 文件安全、可靠多了,也避免了因为版本差异导致的数据兼容问题。一个常见的做法是,在CI/CD流程中,部署脚本里会包含 php artisan migrate --force 这一步,确保每次部署都是“结构最新”的。
团队协作:
php artisan db:seed 或者 php artisan migrate:fresh --seed 能方便地填充数据,保持开发环境的独立性。php artisan migrate 就能得到最新的数据库结构。一个我经常遇到的“坑”是,有人不小心在本地数据库手动改了结构,然后忘了写迁移文件。这种情况下,如果你直接跑 migrate,可能会因为结构已经存在而报错。这时,通常的做法是先回滚到某个点,或者手动修复数据库,然后重新执行迁移。
我们都遇到过那种,迁移跑了一半报错,数据库就变得一团糟的情况。或者,上线后发现某个迁移文件有问题,需要紧急回滚。处理这些情况,Laravel 提供了一些工具,但用起来也得有点策略。
migrate:rollback 的局限性: 这个命令很方便,但它只回滚“最新批次”的迁移。如果你的问题是好几个批次之前的某个迁移导致的,或者你想回滚一个特定的迁移,rollback 就显得力不从心了。这时,你可能需要手动删除 migrations 表中对应的记录,然后手动执行 down() 方法,但这操作比较危险,容易出错。更安全的做法是,如果问题出在旧的迁移,考虑创建一个新的迁移文件来“修复”旧迁移引入的问题,而不是直接去改旧文件。migrate:reset vs migrate:refresh:migrate:reset 会回滚所有迁移,然后什么都不做。这意味着你的数据库会变成一个空壳,所有表都会被删除。它不会重新运行 up() 方法。migrate:refresh 则更像是一个“重置并重建”的过程。它会先执行 reset,然后立即重新运行所有的 up() 方法。这在开发阶段非常有用,可以快速清理并重建数据库结构。migrate:fresh --seed,它会删除所有表,然后重新运行所有迁移,最后执行数据填充。这能确保我的开发环境数据库总是最新的结构和最新的测试数据。Migrations 的能力远不止创建、删除表和字段那么简单,它提供了一套相当强大的 API 来处理各种复杂的数据库变更。
修改列 (Changing Columns):
如果你需要修改现有列的类型、长度,或者使其可空/不可空,Migrations 也能做到。但这需要安装一个额外的包 doctrine/dbal。
composer require doctrine/dbal
然后,你可以在迁移文件中使用 change() 方法:
Schema::table('users', function (Blueprint $table) {
$table->string('email', 100)->change(); // 修改 email 字段长度
$table->string('name')->nullable()->change(); // 使 name 字段可空
});这个功能非常实用,避免了手动修改可能导致的数据类型不兼容问题。
索引的添加与删除: 为了优化查询性能,索引是必不可少的。Migrations 提供了简单的方法来管理索引:
Schema::table('posts', function (Blueprint $table) {
$table->index('user_id'); // 添加普通索引
$table->unique('slug'); // 添加唯一索引
$table->fullText('content'); // 添加全文索引(MySQL/PostgreSQL)
});
// 删除索引
Schema::table('posts', function (Blueprint $table) {
$table->dropIndex(['user_id']);
$table->dropUnique(['slug']);
$table->dropFullText(['content']);
});这比直接写 ALTER TABLE 语句要清晰得多。
外键约束的管理: 外键对于维护数据库关系的完整性至关重要。Migrations 可以轻松地添加和删除外键:
Schema::table('posts', function (Blueprint $table) {
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade'); // 级联删除
});
// 删除外键
Schema::table('posts', function (Blueprint $table) {
$table->dropForeign(['user_id']); // 删除基于列名的外键
});这让数据库关系的管理变得更加直观。
存储过程、视图、触发器等:
虽然 Laravel 的 Schema Builder 没有直接提供创建存储过程或视图的 API,但你可以通过 DB::statement() 方法直接执行原始 SQL 语句。
use Illuminate\Support\Facades\DB;
public function up(): void
{
DB::statement('CREATE VIEW active_users AS SELECT id, name, email FROM users WHERE status = "active"');
// 或者创建存储过程
DB::statement("CREATE PROCEDURE get_user_count() BEGIN SELECT COUNT(*) FROM users; END");
}
public function down(): void
{
DB::statement('DROP VIEW IF EXISTS active_users');
DB::statement('DROP PROCEDURE IF EXISTS get_user_count');
}这种方式虽然不如 Schema Builder 那么优雅,但它提供了极大的灵活性,可以处理任何复杂的数据库对象。
自定义迁移路径:
如果你有非常多的迁移文件,或者想按模块组织,可以自定义迁移文件的存储路径。在 AppServiceProvider 的 register() 方法中添加:
$this->loadMigrationsFrom(database_path('migrations/blog'));这样,你就可以把博客相关的迁移文件放到 database/migrations/blog 目录下。
总之,Laravel Migrations 不仅仅是管理表结构,它是一个全面的数据库版本控制工具。只要你掌握了它的各种用法,就能让数据库管理变得既高效又安全。
以上就是LaravelMigrations怎么管理数据库_LaravelMigrations版本控制的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号