0

0

如何在Laravel中执行数据库迁移

畫卷琴夢

畫卷琴夢

发布时间:2025-07-02 21:42:03

|

632人浏览过

|

来源于php中文网

原创

laravel数据库迁移通过php代码管理数据库结构变更,提供版本控制功能。1. 创建迁移文件:使用artisan命令生成带时间戳的迁移文件并定义up()和down()方法;2. 执行迁移:运行migrate命令按顺序执行未应用的迁移;3. 回滚迁移:使用rollback撤销最近一次迁移,refresh重新运行所有迁移,reset仅回滚所有迁移;4. 多人协作:遵循不修改已提交迁移、拉取后先迁移、解决冲突时保留所有迁移文件等原则;5. 结构变更:支持添加/修改/删除列、重命名表或列、添加索引和外键、直接执行sql语句等操作,实现全面的数据库模式管理。

如何在Laravel中执行数据库迁移

Laravel的数据库迁移功能,说白了,就是一套帮你管理数据库结构变更的工具。它让你能用PHP代码来定义数据库表的创建、修改、删除等操作,然后通过命令行工具轻松地在不同环境(比如开发、测试、生产)之间同步这些变更。对我来说,这简直是版本控制在数据库层面的完美实践,省去了手动SQL的繁琐和出错风险。

解决方案

要在Laravel中执行数据库迁移,核心流程其实就那么几步,相当直观。

首先,你需要创建一个迁移文件。这就像是告诉Laravel:“我要对数据库做点什么了。” 你可以通过Artisan命令行工具来完成:

php artisan make:migration create_products_table --create=products

这条命令会生成一个类似 2023_10_27_123456_create_products_table.php 的文件在 database/migrations 目录下。文件名里的时间戳确保了迁移的执行顺序。--create=products 这个参数会帮你预填充一些创建表的基础代码,省事不少。

打开这个新生成的迁移文件,你会看到两个主要的方法:up()down()

up() 方法是当你的迁移被执行时(也就是“跑起来”的时候)会运行的代码。你在这里定义数据库结构的变更。比如,创建一个 products 表:

id();
            $table->string('name');
            $table->text('description')->nullable();
            $table->decimal('price', 8, 2);
            $table->integer('stock')->default(0);
            $table->timestamps(); // created_at and updated_at
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('products');
    }
};

down() 方法则是在你回滚(撤销)这个迁移时会执行的代码。它应该做的事情是撤销 up() 方法所做的所有变更。对于创建表的操作,down() 方法通常就是删除这个表。这保证了你的数据库状态可以向前和向后平滑地转换,这一点在开发和调试时尤其有用。

定义好迁移文件后,最后一步就是执行它:

php artisan migrate

这条命令会查找所有尚未执行的迁移文件,并按时间戳顺序运行它们的 up() 方法。Artisan 会在你的数据库中创建一个 migrations 表来记录哪些迁移已经被执行过,避免重复运行。

迁移文件写错了怎么办?如何快速回滚或重置数据库结构?

这几乎是每个开发者都会遇到的情况,尤其是项目初期,表结构经常变动。我刚开始接触Laravel迁移的时候,也犯过这样的错误:写完一个迁移,跑起来发现字段名拼错了,或者漏了一个关键字段。

最直接的补救措施是使用 rollback 命令:

php artisan migrate:rollback

这个命令会回滚最近一批执行的迁移。它会运行这些迁移文件中的 down() 方法。如果你只跑了一个新的迁移,那么它就只会回滚这一个。但如果上次你一次性跑了三个新的迁移,rollback 也会把这三个都回滚掉。

有时候,你可能想更彻底一点,直接把数据库结构恢复到“初始状态”,或者干脆想把所有迁移都撤销,然后重新跑一遍。这时候,refresh 命令就派上用场了:

php artisan migrate:refresh

这个命令会先回滚所有已执行的迁移(即运行所有迁移的 down() 方法),然后再次运行所有迁移(即运行所有迁移的 up() 方法)。这在开发阶段非常方便,它能让你快速清空并重建数据库结构。但请注意,在生产环境使用 migrate:refresh 意味着会丢失所有数据,所以务必谨慎。

如果你只是想回滚某个特定的迁移,或者只想回滚最近的N个迁移,可以加上 --step 参数:

启科PHP淘宝客系统
启科PHP淘宝客系统

1、请上传下载到的淘宝客系统安装包并上传到空间根目录中进行解压,解压后将网站文件移动到根目录的位置,然后访问 /install 进行安装。您也可以在本地解压,并以二进制方式将程序上传至您的网站空间。 2、同意启科网络电子商务系统安装协议进入下一步。 3、如果系统检测环境通过,则会提示输入您的数据库服务器地址(一般为本机,即127.0.0.1或者localhost)、数据库账号、数据库密码、数据库名

下载
php artisan migrate:rollback --step=1 // 回滚最近的一个批次
php artisan artisan migrate:rollback --step=3 // 回滚最近的三个批次

还有个 migrate:reset 命令,它会回滚所有迁移,但不会重新运行它们。这在你想彻底清空数据库结构时很有用。

php artisan migrate:reset

记住,down() 方法的正确实现至关重要。如果 down() 方法没有正确地撤销 up() 方法的操作,那么你的回滚操作就可能出现问题,甚至导致数据不一致。

多个开发者协同工作时,迁移如何管理?

团队协作是现代软件开发的核心,而数据库迁移在这种场景下尤其需要一套清晰的策略。我见过一些团队,因为迁移管理不善,导致开发环境混乱,甚至影响到部署。

核心原则是:已提交并执行的迁移,除非万不得已,不要去修改它。

当多个开发者在同一个项目上工作时,通常会遇到以下情况:

  1. 拉取最新代码后: 每次从版本控制系统(如Git)拉取了团队成员的新代码后,你的第一反应就应该是运行 php artisan migrate。这会确保你的本地数据库结构与团队的最新进展保持同步。如果你的同事添加了新的迁移文件,这条命令就会把这些新的结构变更应用到你的本地数据库。
  2. 创建新的迁移: 每个开发者在需要修改数据库结构时,都应该创建新的迁移文件,而不是去修改已存在的、其他同事可能已经执行过的迁移。例如,如果 products 表需要新增一个 weight 字段,你应该创建一个 add_weight_to_products_table 的新迁移,而不是去修改 create_products_table
  3. 合并冲突: 迁移文件因为带有时间戳,通常不太容易出现合并冲突。但如果两个开发者几乎同时创建了两个迁移文件,并且它们的名称或内容有重叠,Git可能会提示冲突。解决冲突时,要确保两个迁移文件的内容都被正确地保留下来,并且它们在执行顺序上是合理的。通常,只需确保两个文件都存在于 database/migrations 目录下,并被Git正确合并即可。
  4. 数据播种 (Seeding): 迁移只负责数据库结构,不负责数据。在团队协作中,为了保持开发环境数据的一致性,通常会配合使用数据播种器(Seeders)。在运行 php artisan migrate 之后,通常会运行 php artisan db:seed(或 php artisan migrate --seed),来填充一些基础数据,确保所有开发者的环境都有相同的起点数据。

我的经验是,保持沟通,并且约定好数据库结构变更的提交和拉取流程,可以大大减少这类问题。例如,约定在每次开始新功能开发前,都先 git pullphp artisan migrate

除了创建表,迁移还能做些什么?

Laravel的迁移功能远不止于创建表这么简单,它实际上是一个强大的数据库结构管理工具,能够处理各种复杂的结构变更。我个人觉得,它的灵活性是其最大的亮点之一。

  1. 添加、修改和删除列: 这是最常见的操作之一。你可以轻松地向现有表添加新列、修改现有列的类型或属性,甚至删除不再需要的列。

    • 添加列:
      Schema::table('users', function (Blueprint $table) {
          $table->string('address')->nullable();
          $table->string('phone')->after('email'); // 在email列之后添加
      });
    • 修改列: 这通常需要 doctrine/dbal 库的支持。
      Schema::table('users', function (Blueprint $table) {
          $table->string('name', 100)->change(); // 将name列长度改为100
          $table->text('description')->nullable()->change(); // 将description列设为可空
      });

      安装 doctrine/dbalcomposer require doctrine/dbal

    • 删除列:
      Schema::table('users', function (Blueprint $table) {
          $table->dropColumn('address');
      });
  2. 重命名表或列: 当你发现最初的命名不够理想时,迁移可以帮你安全地重命名。

    • 重命名表:
      Schema::rename('old_table_name', 'new_table_name');
    • 重命名列:
      Schema::table('users', function (Blueprint $table) {
          $table->renameColumn('old_name', 'new_name');
      });
  3. 添加索引和外键: 优化查询性能和维护数据完整性是数据库设计的关键。

    • 添加索引:
      Schema::table('posts', function (Blueprint $table) {
          $table->index('user_id'); // 普通索引
          $table->unique('slug'); // 唯一索引
          $table->fullText('content'); // 全文索引
      });
    • 添加外键:
      Schema::table('posts', function (Blueprint $table) {
          $table->foreignId('user_id')->constrained()->onDelete('cascade');
          // 或者更详细的定义
          // $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
      });
  4. 删除索引和外键:

    Schema::table('posts', function (Blueprint $table) {
        $table->dropIndex(['user_id']);
        $table->dropUnique(['slug']);
        $table->dropForeign(['user_id']); // 或者指定外键名
    });
  5. 直接执行SQL语句: 虽然不推荐,但在某些复杂或特定数据库的场景下,你可能需要直接执行原生的SQL语句。

    DB::statement('ALTER TABLE users ADD COLUMN points INT DEFAULT 0;');
    // 在down()方法中
    DB::statement('ALTER TABLE users DROP COLUMN points;');

    需要引入 use Illuminate\Support\Facades\DB;

总的来说,Laravel的迁移系统提供了一个非常全面的API来管理数据库模式,它让数据库变更变得可追溯、可管理,并且极大地降低了开发和部署过程中的风险。熟练掌握这些功能,能让你的开发工作流程更加顺畅。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2525

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1604

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1496

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1416

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

61

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号