前言 通常情况下我们要创建 MySQL 数据库的表需要手动创建 SQL 语句。
然而这样一方面是很不方便,另一方面也不安全,如果修改表结构的时候不小心改错了,就会造成无法挽回的后果,而且最关键的是还不知道是谁干的!
之前上班的时候同事就遇到这种情况,有一个同事不小心删了另一个同事要用的表,结果不言而喻……
Phinx 官方网站:https://book.cakephp.org/phinx/0/en/install.html 
Phinx 是一个数据库迁移插件,使用它可以通过 PHP 代码来创建表或者修改表结构。
如此一来就不需要手动使用 SQL 语句去修改数据库了。
安装 Phinx 使用命令:require robmorgan/phinx
完成安装后,再执行 vendor/bin/phinx init:
1 2 3 4 /www/blog# vendor/bin/phinx init Phinx by CakePHP - https://phinx.org. created /www/blog/phinx.php 
 
可以发现它在项目根目录自动创建了一个文件。
配置 Phinx 打开上一步得到的 phinx.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?php return [     'paths' => [         'migrations' => '%%PHINX_CONFIG_DIR%%/db/migrations',         'seeds' => '%%PHINX_CONFIG_DIR%%/db/seeds'     ],     'environments' => [         'default_migration_table' => 'phinxlog',         'default_environment' => 'development',         'production' => [             'adapter' => 'mysql',             'host' => 'localhost',             'name' => 'production_db',             'user' => 'root',             'pass' => '',             'port' => '3306',             'charset' => 'utf8',         ],         'development' => [             'adapter' => 'mysql',             'host' => 'localhost',             'name' => 'development_db',             'user' => 'root',             'pass' => '',             'port' => '3306',             'charset' => 'utf8',         ],         'testing' => [             'adapter' => 'mysql',             'host' => 'localhost',             'name' => 'testing_db',             'user' => 'root',             'pass' => '',             'port' => '3306',             'charset' => 'utf8',         ]     ],     'version_order' => 'creation' ]; 
 
这个就是数据库的配置表,在这里填上自己的数据库账户和密码。
这里有不同的开发环境配置:production(线上环境)、development(开发环境)、testing(测试环境)。
我们暂且只要配置:development 即可。
paths 字段是数据库迁移文件的存放位置,默认是在项目根目录下的 db 文件夹:
1 2 3 4 'paths' => [     'migrations' => '%%PHINX_CONFIG_DIR%%/db/migrations',     'seeds' => '%%PHINX_CONFIG_DIR%%/db/seeds' ], 
 
数据库迁移文件属于项目的一部分,因此我把它修改成了在 app 目录下:
1 2 3 4 'paths' => [     'migrations' => '%%PHINX_CONFIG_DIR%%/app/database/migrations',     'seeds' => '%%PHINX_CONFIG_DIR%%/app/database/seeds' ], 
 
然后创建对应的文件夹即可。
创建表 配置好之后就可以使用命令来创建表了:
1 vendor/bin/phinx create User 
 
上述命令生成了 User 表的数据库迁移文件,
可以发现在 app/database/migrations 目录下多出了一个文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?php declare(strict_types=1); use Phinx\Migration\AbstractMigration; final class User extends AbstractMigration {     /**      * Change Method.      *      * Write your reversible migrations using this method.      *      * More information on writing migrations is available here:      * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method      *      * Remember to call "create()" or "update()" and NOT "save()" when working      * with the Table class.      */     public function change(): void     {     } } 
 
在 change 方法里添加代码:
1 2 3 4 5 6 7 8 9 public function change() {     // create the table     $table = $this->table('users');     $table->addColumn('name', 'string', ['limit' => 32])         ->addColumn('password', 'string', ['limit' => 64])         ->addColumn('created', 'timestamp', ['default' => 'CURRENT_TIMESTAMP'])         ->create(); } 
 
上述代码创建了一张 users 表,包括名称、密码和注册日期。
然后打开 MySQL 数据库,创建一个名字叫做 blog 的数据库。
注意!这里的数据库名字要与 phinx.php 配置文件对应
 
创建表 数据库迁移文件写好之后,就可以用命令执行数据库迁移了。
1 vendor/bin/phinx migrate 
 
执行完成之后再返回查看 blog 数据库,可以发现 users 表已经创建好了。
除了 users 表之外,还有一张 phinxlog 表,这是用来保存迁移记录的。
后言 数据库迁移属于项目单独引用的,以后再考虑封装到框架里面。