在我们分发安装我们的产品的时候,安装数据库是非常麻烦的,基本上你能做的就是导出一份数据库文件,然后封装一个一键安装数据库的功能.这还好,但是如果产品升级了,数据库有了改动,这时候处理起来就很麻烦了,既要兼容旧版本的数据,又要保持新的版本数据库完整.
不过不要怕,那是因为你不知道phinx这样神器.
phinx能够让我们的PHP产品在安装数据库时,变得非常简单,只要编辑一份代码,就可以直接安装到四款不同的数据库中,并且支持跟随版本变动,随时修改数据库表结构.
phinx的追求目标如下:
首先调用命令创建一个迁移文件,我们在这个文件里设置数据库的结构:
vendor/bin/phinx create MyNewMigration
然后写上这样一段代码:
<?php
use Phinx\Migration\AbstractMigration;
class MyNewMigration extends AbstractMigration
{
public function change()
{
$users = $this->table('users');
$users->addColumn('username', 'string', ['limit' => 20])
->addColumn('password', 'string', ['limit' => 40])
->addColumn('password_salt', 'string', ['limit' => 40])
->addColumn('email', 'string', ['limit' => 100])
->addColumn('first_name', 'string', ['limit' => 30])
->addColumn('last_name', 'string', ['limit' => 30])
->addColumn('created', 'datetime')
->addColumn('updated', 'datetime', ['null' => true])
->addIndex(['username', 'email'], ['unique' => true])
->create();
}
}
就这样我们就已经设计好了一个users表,然后调用命令,让数据库生成这个表结构:
phinx migrate
然后就可以在数据库中发现这个表了.
或许以后我们升级产品,会发现不需要这个users表了,这时候我们只要新建另一个迁移文件,这样写:
<?php
use Phinx\Migration\AbstractMigration;
class MyNewMigration extends AbstractMigration
{
/**
* Migrate Up.
*/
public function up()
{
$this->table('users')->drop()->save();
}
/**
* Migrate Down.
*/
public function down()
{
$users = $this->table('users');
$users->addColumn('username', 'string', ['limit' => 20])
->addColumn('password', 'string', ['limit' => 40])
->addColumn('password_salt', 'string', ['limit' => 40])
->addColumn('email', 'string', ['limit' => 100])
->addColumn('first_name', 'string', ['limit' => 30])
->addColumn('last_name', 'string', ['limit' => 30])
->addColumn('created', 'datetime')
->addColumn('updated', 'datetime', ['null' => true])
->addIndex(['username', 'email'], ['unique' => true])
->save();
}
}
这样当我们试图执行安装命令时,会执行up方法,删除users表,但是phinx支持降级,当我们试图回退到某个版本时,会调用down方法,恢复这个users表.
比如回退到某一版本:
phinx rollback -e development -t 20120103083322
像上面两个文件,我们执行之后,既可以安装到mysql,也可以直接安装到其他数据库,比如sqlite等,无需任何代码改动,真正做到数据库设计一次,安装多个.
同时也可以自定义其他数据库驱动,这都是支持的.
phinx还有其他我们会在开发中用到的特性功能,比如数据初始化,数据的操作,配置和模板.
如果你的产品需要分发安装,如果你的产品需要一个可靠的数据库设计改动升级解决方案,phinx就是你正在找的答案.