本文讲述了yii2.0数据库迁移的方法。,具体如下:
创建迁移
使用如下命令来创建一个新的迁移:
yii migrate/create <name>
必填参数 name 的作用是对新的迁移做一个简要的描述。例如,如果这个迁移是用来往多个数据库同一张表 ( 假设每个数据库都有news表 ) 添加字段的,那么你可以使用addColumn_news (该名称自定义)这个名称并运行如下命令:
yii migrate/create addColumn_news
注意:因为 name 参数会被用来生成迁移的类名的一部分,所以该参数应当只包含字母、数字和下划线。
如上命令将会在 @app/migrations 目录下创建一个新的名为 m150101_185401_addColumn_news.php 的 PHP 类文件。该文件包含如下的代码,它们用来声明一个迁移类 m150101_185401_addColumn_news,并附有代码框架:
<?php
use yiidbSchema;
use yiidbMigration;
class m150101_185401_addColumn_news extends Migration
{
//createDbs 该方法是获取数据库对象返回
private function createDbs(){
$dbs = [];
$dbs_info =Yii::$app->params['db'];
foreach($dbs_info as $k=>$v){
$dbs[$k] = Yii::createObject($v);
}
return $dbs;
}
//up() 该方法是往不同的数据库的news表添加 name,nickname,age,sex,site_id等字段
public function up()
{
$dbs = $this->createDbs();
foreach($dbs as $v){ //《------遍历讲字段同时添加到不同的数据库中
$this->db=$v;
$this->addColumn('{{%news}}','name','varchar(20)');
$this->addColumn('{{%news}}','nickname','varchar(20)');
$this->addColumn('{{%news}}','age','int(3)');
$this->addColumn('{{%news}}','sex','int(1)');
$this->addColumn('{{%news}}','site_id','int(5)');
}
}
//down() 该方法与up()方法相反,是删除字段的意思
public function down()
{
$dbs = $this->createDbs();
foreach($dbs as $v){
$this->db=$v;
$this->dropColumn('{{%news}}','name','varchar(20)');
$this->dropColumn('{{%news}}','nickname','varchar(20)');
$this->dropColumn('{{%news}}','age','int(3)');
$this->dropColumn('{{%news}}','sex','int(1)');
$this->dropColumn('{{%news}}','site_id','int(5)');
}
}
}
每个数据库迁移都会被定义为一个继承自 yiidbMigration 的 PHP 类。类的名称按照 m<YYMMDD_HHMMSS>_<Name> 的格式自动生成,其中
<YYMMDD_HHMMSS> 指执行创建迁移命令的 UTC 时间。
<Name> 和你执行命令时所带的 name 参数值相同。
在迁移类当中,你应当在 up() 方法中编写改变数据库结构的代码。你可能还需要在 down() 方法中编写代码来恢复由 up() 方法所做的改变。 当你通过 migration 升级数据库时, up() 方法将会被调用,反之, down() 将会被调用。如下代码展示了如何通过迁移类来创建一张 news 表:







