使用如下命令来创建一个新的迁移:
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 yii\db\Schema; use yii\db\Migration; 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)'); } } }
每个数据库迁移都会被定义为一个继承自 yii\db\Migration 的 PHP 类。类的名称按照 m<YYMMDD_HHMMSS>_<Name> 的格式自动生成,其中
<YYMMDD_HHMMSS> 指执行创建迁移命令的 UTC 时间。
<Name> 和你执行命令时所带的 name 参数值相同。
在迁移类当中,你应当在 up() 方法中编写改变数据库结构的代码。你可能还需要在 down() 方法中编写代码来恢复由 up() 方法所做的改变。 当你通过 migration 升级数据库时, up() 方法将会被调用,反之, down() 将会被调用。如下代码展示了如何通过迁移类来创建一张 news 表:
use yii\db\Schema; use yii\db\Migration; class m150101_185401_create_news_table extends \yii\db\Migration { public function up() { $this->createTable('news', [ 'id' => Schema::TYPE_PK, 'title' => Schema::TYPE_STRING . ' NOT NULL', 'content' => Schema::TYPE_TEXT, ]); } public function down() { $this->dropTable('news'); } }
注意:并不是所有迁移都是可恢复的。例如,如果 up() 方法删除了表中的一行数据,这将无法通过 down() 方法来恢复这条数据。有时候,你也许只是懒得去执行 down() 方法了,因为它在恢复数据库迁移方面并不是那么的通用。在这种情况下,你应当在down() 方法中返回 false 来表明这个 migration 是无法恢复的。
访问数据库的方法
迁移的基类 yii\db\Migration 提供了一整套访问和操作数据库的方法。你可能会发现这些方法的命名和 yii\db\Command 类提供的 DAO 方法很类似。 例如,yii\db\Migration::createTable() 方法可以创建一张新的表,这和 yii\db\Command::createTable() 的功能是一模一样的。
使用 yii\db\Migration 所提供的方法的好处在于你不需要再显式的创建 yii\db\Command 实例,而且在执行每个方法的时候都会显示一些有用的信息来告诉我们数据库操作是不是都已经完成,还有它们完成这些操作花了多长时间等等。
如下是所有这些数据库访问方法的列表:
yii\db\Migration::execute(): 执行一条 SQL 语句
yii\db\Migration::insert(): 插入单行数据
yii\db\Migration::batchInsert(): 插入多行数据
yii\db\Migration::update(): 更新数据
yii\db\Migration::delete(): 删除数据
yii\db\Migration::createTable(): 创建表
yii\db\Migration::renameTable(): 重命名表名
yii\db\Migration::dropTable(): 删除一张表
yii\db\Migration::truncateTable(): 清空表中的所有数据
yii\db\Migration::addColumn(): 加一个字段
yii\db\Migration::renameColumn(): 重命名字段名称
yii\db\Migration::dropColumn(): 删除一个字段
yii\db\Migration::alterColumn(): 修改字段
yii\db\Migration::addPrimaryKey(): 添加一个主键
yii\db\Migration::dropPrimaryKey(): 删除一个主键
yii\db\Migration::addForeignKey(): 添加一个外键
yii\db\Migration::dropForeignKey(): 删除一个外键
yii\db\Migration::createIndex(): 创建一个索引
yii\db\Migration::dropIndex(): 删除一个索引
提交迁移
为了将数据库升级到最新的结构,你应该使用如下命令来提交所有新的迁移:
yii migrate