laravel migration

官方文檔: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編程

  1. –path是指定遷移文件生成的位置,默認是放在 應用根目錄/database/migrations下面,若是指定了–path=x/y/x,就會在 應用根目錄/x/y/z下面生成遷移文件,注意的是得保證該目錄已存在,不然會報錯
  2. 新建表時,name的寫法能夠是 create_表名_table,這種寫法,後面的create能夠省略,不然不能省,如make:migration wang –create=members
  3. 選項前有兩個減號–,新手易寫掉一個
  4. –create=表名,新建一個表,表名通常全爲小寫字母,複數形式
  5. –table=表名,修改現成的表
  6. –create與–tabel是2選1
  7. 在命令行自動生成的遷移文件只能是在當前項目下,若是想在項目外如vendor/包/模塊中生成遷移文件,得手工編寫,或自動生成後拷貝到指定地方,但要注意的是模塊中的服務提供商中得寫publish方法
  8. 生成的遷移文件名格式是 yyyy_mm_dd_His_name.php,文件中類名是將name寫在大駝峯的格式,如name爲create_admins_table變成class CreateAdminsTable extends Migration
  9. 生成的文件名是能夠修改的,用來調整順序,系統的排序是asort(名字名組成的數組,SORT_REGULAR ); 以升序的方式排列的,因此更名時要注意
  10. 沒有運行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();但這種方式不適合外鍵

熟悉遷移命令

    1. 生成遷移文件 
      php artisan make:migration create_wang04_table --path=database/migrations2 
      php artisan make:migration create_wang05_table --path=database/migrations2
    2. 運行遷移,凡在指定路徑下有的文件名,沒有出如今倉庫表的migration字段中的,就會執行 
      php artisan migrate --database=mysql2 --path=database/migrations2
    3. 撤銷上一步遷移,只一步啊,上一次migrate有多少變更,如生成5張表,這一次會所有撤銷 
      php artisan migrate:rollback --database=mysql2 --path=database/migrations2
    4. 撤銷所有,清空倉庫表,除了倉庫表外,全部的表都刪除 
      php artisan migrate:reset --database=mysql2 --path=database/migrations2
    5. 刪除全部的表,再從新運行一個遷移,它的效率比6要高 
      php artisan migrate:fresh --database=mysql2 --path=database/migrations2
    6. 所有撤銷並從新運行遷移,與fresh的差異是它是一步一步的撤銷,原來假設有78步,那麼就一步一步撤,再一步一步運行,它倆有一個共同點是,最後只算一批,也就是全部的遷移是一批,倉庫表中的batch值所有爲1 
      php artisan migrate:refresh --database=mysql2 --path=database/migrations2
    7. 顯示當前遷移的狀態 
      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 命令後,便可生效

相關文章
相關標籤/搜索