官方文檔:https://laravel.com/docs/5.5/migrationsphp
一,生成遷移mysql
php artisan make:migration create_表名(複數)_tablelaravel
例如新建一個admins表sql
php artisan make:migration create_admins_table數據庫
注意make:migration有1個必寫的參數name, 3個可選的選項 –create,–tabel,–path編程
- –path是指定遷移文件生成的位置,默認是放在 應用根目錄/database/migrations下面,若是指定了–path=x/y/x,就會在 應用根目錄/x/y/z下面生成遷移文件,注意的是得保證該目錄已存在,不然會報錯
- 新建表時,name的寫法能夠是 create_表名_table,這種寫法,後面的create能夠省略,不然不能省,如make:migration wang –create=members
- 選項前有兩個減號–,新手易寫掉一個
- –create=表名,新建一個表,表名通常全爲小寫字母,複數形式
- –table=表名,修改現成的表
- –create與–tabel是2選1
- 在命令行自動生成的遷移文件只能是在當前項目下,若是想在項目外如vendor/包/模塊中生成遷移文件,得手工編寫,或自動生成後拷貝到指定地方,但要注意的是模塊中的服務提供商中得寫publish方法
- 生成的遷移文件名格式是 yyyy_mm_dd_His_name.php,文件中類名是將name寫在大駝峯的格式,如name爲create_admins_table變成
class CreateAdminsTable extends Migration
- 生成的文件名是能夠修改的,用來調整順序,系統的排序是
asort(名字名組成的數組,SORT_REGULAR );
以升序的方式排列的,因此更名時要注意- 沒有運行migrate以前,遷移文件是能夠手工刪除和更名,修改內容的
二,編輯遷移json
up是migrate時執行的方法
down是migrate:rollback,migrate:reset,migrate:fresh,migrate:refresh時會執行的方法
Facade(有人翻譯成門面,我以爲翻譯成表面比較合適些) Schema::方法其實是執行\Illuminate\Database\Schema\MySqlBuilder
的方法,分下面幾種數組判斷的有 hasTable,hasColumn,hasColumns
讀取的有 getAllTables,getColumnListing,getColumnType,getConnection
設置的有 setConnection,blueprintResolver
刪除的有 dropAllTables
操做的有 rename,enableForeignKeyConstraints,disableForeignKeyConstraints
* 遷移經常使用有 create,table,drop,dropIfExists *框架Blueprint(翻譯成藍圖),其實就是表明一個數據庫中的表,它的方法主要有2種,一是針對命令commands的方法,另是針對列columns的方法,命令和列都是一個流Fluent對象,處理命令的方法很少,主要熟悉的是處理列的方法,下面是針對Mysql數據的一些列方法和修飾器ide
class CreateArticleTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('article', function (Blueprint $table) { $table->increments('id')->comment('文章ID'); $table->string('title',50)->unique()->comment('文章標題'); $table->string('author')->comment('文章做者'); $table->longText('content')->comment('文章內容'); $table->timestamp('add_time')->comment('添加時間'); // $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('article'); } }
分類 | 方法 | mysql類型 | 使用說明 |
---|---|---|---|
字符串01 | char(列名, 長度 = null) | char | 定長字符串 |
字符串02 | string(列名, 長度 = null) | varchar | 長度可變字符串 |
字符串03 | text(列名) | text | 支持2^16-1個字節,至關於2.1萬個漢字 |
字符串04 | mediumText(列名) | mediutext | 支持2^24-1個字節,至關於560萬個漢字 |
字符串05 | longText(列名) | longtext | 支持2^32-1個字節,至關於14億個漢字 |
實現01: | rememberToken() | varchar(100) | string(‘remember_token’, 100)->nullable() |
實現02: | uuid(列名) | char(36) | |
實現03: | ipAddress(列名) | varchar(45) | |
實現04: | macAddress(列名) | varchar(17) |
說明1: string長度指的是字符長度,不是字節,最大支持2^8-1=255個字符,1個數字,字母,漢字都是算一個字符,string(‘name’,25)表示能夠儲存25個漢字
說明2: text長度指的是字節,
說明3: char適合等長密碼,郵編等,默認爲…Builder::$defaultStringLength,這個值是能夠在服務提供商中修改的
說明4: text與string有些不同,在utf8編碼下,一個漢字至關於3個字節,最大支持21845個漢字,多一個字就會報錯
分類 | 方法 | mysql類型 | 使用說明 |
---|---|---|---|
整數01 | 參數(列名, 自增加 = false, 無符號 = false) tinyIntegert 和 unsignedTinyInteger |
tinyint | 佔1個字節,長度2^8 |
整數02 | integer 和 unsignedInteger | int | 佔2個字節,長度2^16 |
整數03 | smallInteger 和 unsignedSmallInteger | smallint | 佔3個字節,長度2^24 |
整數04 | mediumInteger 和 unsignedMediumInteger | mediumint | 佔4個字節,長度 2^32 |
整數05 | bigInteger 和 unsignedBigInteger | bigint | 佔8個字節,長度2^63 |
自增加列01 | increments(列名) unsignedInteger(列名, true) | ||
自增加列02 | tinyIncrements(列名) unsignedTinyInteger(列名, true) | ||
自增加列03 | smallIncrements(列名) unsignedSmallInteger(列名, true) | ||
自增加列04 | mediumIncrements(列名) unsignedMediumInteger(列名, true) | ||
自增加列05 | bigIncrements(列名) unsignedBigInteger(列名, true) | ||
真假 | boolean($column) | tinyint(1) |
說明1: 整數類型都指定不了長度,也指定不了zerofill,不過這沒有關係,由於整數實際存儲的長度與指定的長度沒有關係,只是顯示的長度而已
分類 | 方法 | mysql類型 | 使用說明 |
---|---|---|---|
單精度浮點數 | float(column,column,total = 8, $places = 2) | 棄用 | 單精度必需要指定M和D |
雙精度浮點數 | double(column,column,total = null, $places = null) | double(M,D) 或double | |
正負定點數 | decimal(column,column,total = 8, $places = 2) unsignedDecimal |
decimal(M,D) | 精度和標度必須指定,默認爲(8,2) |
說明1: float是單精度浮點數,double是雙精度浮點數,decimal是定點數
說明2: float佔4個字節,double佔8個字節
說明3: 這3個類型也能夠理解爲小數
說明4: 浮點數存在偏差問題,定點數精確,對貨幣等對精度敏感的數據,應該用定點數表示或存儲;
說明5: 編程中,若是用到浮點數,要特別注意偏差問題,並儘可能避免作浮點數比較;
說明6: FLOAT(M,D),DOUBLE(M,D)。表示共M位數,小數點前面爲M-D位,小數點後面爲D位
說明7: decimal在mysql內存是以字符串存儲的
分類 | 方法 | mysql類型 | 使用說明 |
---|---|---|---|
日期 | date($column) | date | |
時間 | time($column) | time | |
時間 | timeTz($column) | time | |
日期時間 | dateTime(column,column,precision = 0) | datetime(精度) datetime |
|
日期時間 | dateTimeTz(column,column,precision = 0) | datetime | |
時間戳 | timestamp(column,column,precision = 0) | timestamp | 用使用useCurrent使用當前時間 |
時間戳 | timestampTz(column,column,precision = 0) | timestamp | |
時間戳實現 | timestamps(precision=0)...||timestamp(′createdat′,precision=0)...||timestamp(′createdat′,precision)->nullable(); timestamp(‘updated_at’, $precision)->nullable(); |
||
時間戳實現 | timestampsTz(precision=0)...||timestampTz(′createdat′,precision=0)...||timestampTz(′createdat′,precision)->nullable(); timestampTz(‘updated_at’, $precision)->nullable(); |
||
時間戳實現 | nullableTimestamps($precision = 0) | 是timestamps的別名 | |
時間戳實現 | softDeletes(列名 = ‘deleted_at’,精度 = 0) | ||
時間戳實現 | softDeletesTz($precision = 0) |
說明01: datetime不支持取默認值now(),版本5.6以後的能夠默認值CURRENT_TIMESTAMP,它會取當前時間,並轉爲2017-11-01 23:25:45類的格式,但這種狀況不能指定精度,另處寫法是new \Illuminate\Database\Query\Expression(‘CURRENT_TIMESTAMP’)才能使用Mysql中的常量
說明02: timestamp(‘列名’,精度),若是指定了精度就不能使用修飾->useCurrent(),框架源代碼此處是一個bug,等修正, 只有不指定精度時纔可能使用useCurrent
說明03: datetime(3)意思是保留3爲毫秒數,timestamp(‘login’,3);的結果如2017-11-02 02:08:34.864,也是保留3位毫秒
說明04: TZ是系統時區的意思,但實際使用中使用非Tz格式就行
說明05: 未提供year的方法,多是year的範圍過小的緣由捨棄了,可使用date獲取
日期類型 | 存儲空間 | 日期格式 | 日期範圍 |
---|---|---|---|
datetime | 8 bytes | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 |
timestamp | 4 bytes | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 至 2038 |
date | 3 bytes | YYYY-MM-DD | 1000-01-01 至 9999-12-31 |
year | 1 bytes | YYYY | 1901 至 2155 |
分類 | 方法 | mysql類型 | 使用說明 |
---|---|---|---|
枚舉 | enum($column, [‘市場部’,’設計部’,’總裁辦’]) | 生成enum(‘市場部’,’設計部’,’總裁辦’) | |
json($column) | json | 這是5.7.7後纔有的功能 | |
jsonb($column) | json | 這是5.7.7後纔有的功能 |
說明:json很好用,但要看mysql版本支不支持
indexCommand(type,type,columns, index,index,algorithm = null)
dropIndexCommand(command,command,type, $index)
5種索引的單獨命令
命令 | 實際 |
---|---|
primary | indexCommand(‘primary’, columns,columns,name, $algorithm) |
unique | indexCommand(‘unique’, columns,columns,name, $algorithm) |
index | indexCommand(‘index’, columns,columns,name, $algorithm) |
spatialIndex | indexCommand(‘spatialIndex’, columns,columns,name) |
foreign | indexCommand(‘foreign’, columns,columns,name) |
dropIndex | dropIndexCommand(‘dropIndex’, ‘index’, $index) |
dropPrimary | dropIndexCommand(‘dropPrimary’, ‘primary’, $index) |
dropUnique | dropIndexCommand(‘dropUnique’, ‘unique’, $index) |
dropForeign | dropIndexCommand(‘dropForeign’, ‘foreign’, $index) |
說明:若是將某單列定義爲某種索引,能夠直接按修飾命令的方式定義,如 $table->string(‘name’)->unique();但這種方式不適合外鍵
php artisan make:migration create_wang04_table --path=database/migrations2
php artisan make:migration create_wang05_table --path=database/migrations2
php artisan migrate --database=mysql2 --path=database/migrations2
php artisan migrate:rollback --database=mysql2 --path=database/migrations2
php artisan migrate:reset --database=mysql2 --path=database/migrations2
php artisan migrate:fresh --database=mysql2 --path=database/migrations2
php artisan migrate:refresh --database=mysql2 --path=database/migrations2
php artisan migrate:status --database=mysql2 --path=database/migrations2
migate命令會將沒有運行過的遷移文件運行,有幾個執行幾個 ,不用擔憂會把以前有數據的表從新構建!
migrate:rollback 只會撤銷最後一批,如上面會撤銷第3批生成的兩個表
migrate:install 用來生成倉庫表,不用執行,系統會自動執行,且只會執行一次,該表不會被撤銷
migrate:status 顯示哪些遷移文件還未運行,N表示還未運行
migrate:reset Rollback all database migrations
migrate:fresh 會刪除全部已經生成的表,並從新運行全部的遷移
migrate:refresh Reset and re-run all migrations
Ran? | Migration |
---|---|
Y | 2017_11_02_091523_wang01 |
Y | 2017_11_02_103519_create_json_table |
Y | 2017_11_02_142016_create_wang01_table |
Y | 2017_11_02_142040_create_wang02_table |
Y | 2017_11_02_142103_create_wang03_table |
Y | 2017_11_02_142928_create_wang04_table |
N | 2017_11_02_143043_create_wang05_table |
N | 2017_11_02_143104_create_wang06_table |
數據遷移文件通常與模塊放在一塊兒,好比你開發了一個模塊,有本身的數據表,當別人使用你的模塊時,得先將你的數據遷移文件拷貝到應用的指定文件夾下。這樣很不方便,因此得在模塊的服務提供商文件中寫好發佈方法
<?php namespace Wang\Providers; use Illuminate\Support\ServiceProvider; class ModuleServiceProvider extends ServiceProvider{ protected $defer = false; public function boot(){ $this->publishMigrations(); } private function publishMigrations() { $this->publishes([__DIR__ . '/../../migrations/' => base_path('database/migrations2')], 'migrations'); } }
在使用的應用中,只要使用 php artisan vendor:publish 就會將模塊中的遷移文件拷貝到應用下相應目錄中
答:通常的作法是,先在當前應用中生成,經測試沒問題後,可直接拷貝到模塊中
2)修改已建立的數據表字段(make:migration add)
想要修改已建立的數據表,不能直接改原來的 migrate 文件,要新建一個遷移文件,命令以下:
php artisan make:migration add_description_to_articles_table --table=articles
php artisan make:migration change_description_on_articles_table --table=articles
PS:其實migrate 文件的名字是怎麼的都無所謂的,主要是裏面的內容,不過名字都是要儘可能寫規範一點,讓別人看到名字就知道是什麼意思
添加或修改字段的操做是很是類似的,後者只是多了一個change()方法
新增字段:
public function up() { Schema::table('articles', function (Blueprint $table) { $table->string('description')->nullable()->after('title'); }); } public function down() { Schema::table('articles', function (Blueprint $table) { $table->dropColumn('description'); }); }
修改字段:
public function up() { Schema::table('articles', function (Blueprint $table) { $table->string('description', 200)->change(); }); } public function down() { Schema::table('articles', function (Blueprint $table) { // }); }
運行 php artisan migrate 命令後,便可生效