yii2迁移是版本化、可回滚的数据库结构与初始数据变更机制,须幂等、禁业务逻辑、禁生产环境down,时间戳命名不可手动修改。

在 Yii2 项目中快速创建、修改数据库表结构并确保团队间结构一致,必须依赖迁移工具执行版本化 SQL 操作,而不是直接在生产库手动改表或运行 SQL 脚本。
初始化迁移环境
进入项目根目录,确认 console/config/main.php 中已配置 'db' => require(__DIR__ . '/../../config/db.php'),且该 db 配置能正常连接目标数据库。这一步漏掉会导致后续所有命令报错“Connection refused”或“Unknown database”。
运行 php yii migrate/create create_user_table,命令会在 console/migrations/ 下生成一个以时间戳开头的 PHP 文件,例如 m240315_102233_create_user_table.php。
迁移文件名中的时间戳是 Yii2 的排序依据,【不可手动修改时间戳部分】,否则 migrate/list 会识别错序,回滚时可能跳过关键步骤。
编写迁移类中的 up() 和 down()
打开刚生成的迁移文件,在 up() 方法中用 $this->createTable() 或 $this->addColumn() 编写建表或变更逻辑;在 down() 方法中写对应逆向操作,比如 $this->dropTable('user') 或 $this->dropColumn('user', 'status')。
注意:如果 up() 中执行了 $this->insert() 插入初始数据,down() 必须显式 $this->delete() 清理,否则回滚后残留脏数据。Yii2 不自动追踪数据变更。
这一步操作起来很简单,直接把字段定义数组填进 createTable() 第二个参数就行,但字段类型必须用 Yii2 常量(如 Schema::TYPE_STRING),不能写 VARCHAR(255) —— 否则跨数据库(MySQL/PostgreSQL)时会报错。
执行迁移
方法一:运行全部待执行迁移php yii migrate
系统会逐个执行 console/migrations/ 下未标记为“已执行”的迁移文件,并在 migration 表中记录状态。
方法二:只执行最新一个迁移php yii migrate/up 1
适合调试单个迁移文件,避免误触其他未测试的变更。
方法三:指定执行某迁移(含路径)php yii migrate/to m240315_102233_create_user_table
【该操作不可逆,执行后跳过的中间迁移将不再自动补上】,仅用于紧急修复或分支合并后的精确同步。
查看与回滚迁移
第一步:列出所有迁移状态php yii migrate/history 显示已执行的迁移及其时间戳和状态;php yii migrate/new 显示尚未执行的迁移列表。
第二步:回滚最近一次迁移php yii migrate/down 1 → 自动调用对应迁移类的 down() 方法,并从 migration 表中删除该条记录。
第三步:回滚到指定版本php yii migrate/to m240310_084522_init_base_tables → 系统会先判断当前版本,再逐个执行 down() 直至目标时间戳(不含该目标迁移本身)。若目标迁移不存在,命令直接失败,不会静默跳过。
第四步:强制重跑某迁移(慎用)php yii migrate/down 1 → php yii migrate/up 1。不要用 refresh,它会清空整个 migration 表并重建所有表,导致生产数据全丢。











