首页 > php框架 > Laravel > 正文

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

畫卷琴夢
发布: 2025-07-02 21:42:03
原创
474人浏览过

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 表:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('products', function (Blueprint $table) {
            $table->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 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 pull 并 php 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/dbal:composer 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来管理数据库模式,它让数据库变更变得可追溯、可管理,并且极大地降低了开发和部署过程中的风险。熟练掌握这些功能,能让你的开发工作流程更加顺畅。

以上就是如何在Laravel中执行数据库迁移的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

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