認識老是在不斷進步的,其實事情遠遠沒有這麼複雜,咱們只須要安裝一個插件就夠了:php
composer require -dev --prefer-dist insolita/yii2-migration-generator:~2.3
而後你只須要訪問Yii的gii
頁面,就能夠從原有的數據庫裏自動導出migrate文件了。不過如下方法依然有用,就是在你建立一個新的數據庫表的時候。html
關於Yii2的migrate使用的文章網上已有很多,但不少已經舊了,大量的仍是教你如何編寫代碼,但實際上最新版Yii2的migrate能夠儘可能減小編寫代碼的工做,至少能夠減小編寫php代碼而只經過命令行的方式就能達到目的。mysql
咱們直接分析如下命令行:linux
./yii migrate/create create_fac_item_table --fields="idfac_item:primaryKey,item_name:string(12):notNull,fac_id:integer:notNull:foreignKey(facility idfacility)"
雖然看上去很長,可是想清楚了寫出來仍是不難的。它分爲這麼幾個部分:sql
./yii
,這是linux下的標準執行命令,沒什麼好說的。數據庫
migrate/create
,前面migrate
這是Yii2裏執行migrate的標準命令,後面create
是說明咱們要建立一個新的migrate文件。yii2
create_fac_item_table
,這裏create_xxx_table
是一個標準格式,就是說咱們要建立的這個migrate文件要完成的任務是建立名稱爲xxx的數據庫表,我這裏要建立的表的名稱是fac_item
,因此是這種格式。app
--fields=""
,引號裏的內容詳細說明了咱們要建立的這張數據庫表中的字段名稱及類型等。下面詳細說明:composer
idfac_item:primaryKey
,這個地方的意思是說這個表的主鍵名稱爲idfac_item
yii
item_name:string(12):notNull
,這是第2個字段,它是一個string
類型,長度爲12
,不容許爲空
fac_id:integer:notNull:foreignKey(facility idfacility)
,這是第3個字段,它是一個數字型,非空,而且還有一個外鍵,鏈接到一個名稱爲facility
的數據庫表,鏈接的主鍵名稱爲idfacilit
y,中間以空格區格。
所有寫好以後回車,它會問你是否要執行,以下:
Yii Migration Tool (based on Yii v2.0.12-dev) Create new migration '/Library/WebServer/Documents/project/console/migrations/m170602_002220_create_fac_item_table.php'? (yes|no) [no]:yes New migration created successfully.
它會自動在console/migrations
下生成一個新的.php文件,以下:
<?php use yii\db\Migration; class m170602_002220_create_fac_item_table extends Migration { public function up() { $this->createTable('fac_item', [ 'idfac_item' => $this->primaryKey(), 'item_name' => $this->string(12)->notNull(), 'fac_id' => $this->integer()->notNull(), ]); // creates index for column `fac_id` $this->createIndex( 'idx-fac_item-fac_id', 'fac_item', 'fac_id' ); // add foreign key for table `facility` $this->addForeignKey( 'fk-fac_item-fac_id', 'fac_item', 'fac_id', 'facility', 'idfacility', 'CASCADE' ); } public function down() { // drops foreign key for table `facility` $this->dropForeignKey( 'fk-fac_item-fac_id', 'fac_item' ); // drops index for column `fac_id` $this->dropIndex( 'idx-fac_item-fac_id', 'fac_item' ); $this->dropTable('fac_item'); } }
up和down的做用就不詳細解釋了,官方文檔有詳細解釋,大意是說up是向上執行,down讓你有個後悔的餘地。
缺省狀況下,你的console/migrations
目錄下應該還有另一個關於user表的建立文件,因此若是你如今就執行./yii migrate
的話,它會問你是否要執行全部的操做:
Yii Migration Tool (based on Yii v2.0.12-dev) Total 2 new migrations to be applied: m130524_201442_init m170602_002220_create_fac_item_table Apply the above migrations? (yes|no) [no]:no
在這裏,咱們選擇no
,由於咱們數據庫裏已經有user
這張表了,不須要再建立一遍,咱們須要標記一下,免得它之後老問咱們這個問題:
./yii migrate/mark m130524_201442_init
而後再執行./yii migrate
Yii Migration Tool (based on Yii v2.0.12-dev) Total 1 new migrations to be applied: m170602_002220_create_fac_item_table Apply the above migrations? (yes|no) [no]:yes *** applying m170602_002220_create_fac_item_table > create table fac_item ... done (time: 0.555s) > create index idx-fac_item-fac_id on fac_item (fac_id) ... done (time: 0.649s) > add foreign key fk-fac_item-fac_id: fac_item (fac_id) references facility (idfacility) ... done (time: 0.529s) *** applied m170602_002220_create_fac_item_table (time: 1.986s) 1 migration were applied. Migrated up successfully.
用mysql workbench檢查數據庫,發現表已成功創建:
外鍵也是正確的:
我這裏舉的例子只是建立數據庫表,其它好比刪除數據庫表,添加字段,刪除字段等工做均可以用這種命令行的方式完成,具體就不細講了,你們能夠去參考Yii2的官方文檔。