Schema產生器
介紹
Laravel Schema
類別提供一個與資料庫語法不相關的方法,讓你可以透過語意對資料表進行操作及異動,在 Laravel 支援的資料庫,都可以用此統一的API去對不同的資料庫進行管理。
建立與刪除資料表
使用 Schema::create
方法,去建立新的資料表:
Schema::create('users', function($table)
{
$table->increments('id');
});
create
方法的第一個參數是資料表的名稱,第二個 閉合(Closure)
函式會收到 Blueprint
物件,這個物件可以讓你用來定義新的資料表的屬性。
使用 Schema::rename
方法可以去重新命名已存在的資料表:
Schema::rename($from, $to);
在 schema 的操作中,可以使用 Schema::connection
方法去指定你想要使用的資料庫連線:
Schema::connection('foo')->create('users', function($table)
{
$table->increments('id'):
});
使用 Schema::drop
方法,可以移除資料表:
Schema::drop('users');
Schema::dropIfExists('users');
增加欄位
使用 Schema::table
方法,可以更新已存在資料表的屬性:
Schema::table('users', function($table)
{
$table->string('email');
});
在你使用資料表產生器建立資料表屬性時,可以使用各種不同的欄位類型:
指令 | 描述 |
---|---|
$table->increments('id'); |
建立自動增加 (Incrementing) 的編號的欄位到資料表 (primary key). |
$table->string('email'); |
建立長度為 255 的 VARCHAR 欄位 |
$table->string('name', 100); |
建立指定長度的 VARCHAR 欄位 |
$table->integer('votes'); |
建立 INTEGER 屬性的欄位 |
$table->bigInteger('votes'); |
建立 BIGINT 屬性的欄位 |
$table->smallInteger('votes'); |
建立 SMALLINT 屬性的欄位 |
$table->float('amount'); |
建立 FLOAT 屬性的欄位 |
$table->decimal('amount', 5, 2); |
建立有效位數為5 (precision),小數位數為2 (scale) 的 DECIMAL 屬性的欄位 |
$table->boolean('confirmed'); |
建立 BOOLEAN 屬性的欄位 |
$table->date('created_at'); |
建立 DATE 屬性的欄位 |
$table->dateTime('created_at'); |
建立 DATETIME 屬性的欄位 |
$table->time('sunrise'); |
建立 TIME 屬性的欄位 |
$table->timestamp('added_on'); |
建立 TIMESTAMP 屬性的欄位 |
$table->timestamps(); |
加入 created_at 及 updated_at 欄位,屬性為 DATETIME |
$table->softDeletes(); |
加入 deleted_at 欄位給微刪除用 (soft deletes) |
$table->text('description'); |
建立 TEXT 屬性的欄位 |
$table->binary('data'); |
建立 BLOB 屬性的欄位 |
$table->enum('choices', array('foo', 'bar')); |
建立 ENUM 屬性的欄位 |
->nullable() |
指定欄位可以使用 null 值 |
->default($value) |
定義欄位預設值 |
->unsigned() |
設定整數 (INTEGER) 為非負整數 |
如果你使用 MySQL 資料庫,你可以使用 after
方法去指定欄位的順序:
在 MySQL 使用 After 方法
$table->string('name')->after('email');
重新命名欄位
使用 renameColumn
方法,可以重新命名欄位名稱:
重新命名欄位名稱
Schema::table('users', function($table)
{
$table->renameColumn('from', 'to');
});
注意: 尚未支援重新命名
enum
欄位類型的名稱
移除欄位
從資料表移除單個欄位
Schema::table('users', function($table)
{
$table->dropColumn('votes');
});
從資料表移除多個欄位
Schema::table('users', function($table)
{
$table->dropColumn('votes', 'avatar', 'location');
});
檢查是否存在
你可以使用 hasTable
及 hasColumn
方法,很容易的分別檢查資料表或欄位是否存在:
檢查資料表是否存在
if (Schema::hasTable('users'))
{
//
}
檢查欄位是否存在
if (Schema::hasColumn('users', 'email'))
{
//
}
增加索引
schema 產生器支援數種不同類型的索引,這裡可以使用兩種方法去加入索引,首先你可以在欄位定義後面去加入索引,或者分別去加入欄位及索引:
欄位定義後面加入索引
$table->string('email')->unique();
或者在不同行分別加入欄位及索引,以下是所有可用的索引類型清單:
指令 | 描述 |
---|---|
$table->primary('id'); |
加入主鍵 (primary key) |
$table->primary(array('first', 'last')); |
加入組合鍵 |
$table->unique('email'); |
加入唯一值索引 (unique) |
$table->index('state'); |
加入基本的索引 (index) |
外來鍵
Laravel 也支援加入外來鍵限制的功能到你的資料表:
加入外來見到資料表
$table->foreign('user_id')->references('id')->on('users');
在這個範例,我們將指定 user_id
欄位狀態,去參考 users
資料表的 id
欄位。
我們也可以指定在 "資料刪除時 (on delete)" 及 "資料更新時 (on update)" 關聯限制的操作:
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
使用 dropForeign
方法,可移除外來鍵,這是方法命名是相似於移除索引的方法名稱 dropIndex
:
$table->dropForeign('posts_user_id_foreign');
注意: 當建立一個外來鍵參照到自動增加整數的欄位時,記得要指定外來鍵欄位屬性為非負整數的
unsigned
移除索引
為了移除索引,你必須指定索引的名稱,Laravel 預設使用合乎邏輯的索引名稱,簡單的連接 "資料表名稱" 、 "索引欄位名稱" 以及 "索引類型" 即可,以下是一些相關的範例:
指令 | 描述 |
---|---|
$table->dropPrimary('users_id_primary'); |
從 "users" 資料表移除主鍵 (primary key) |
$table->dropUnique('users_email_unique'); |
從 "users" 資料表移除唯一鍵 (unique) |
$table->dropIndex('geo_state_index'); |
從 "geo" 資料表移除基本的索引 (index) |
儲存引擎
在 schema 產生器中,可以使用 engine
屬性,去設定資料表的儲存引擎:
Schema::create('users', function($table)
{
$table->engine = 'InnoDB';
$table->string('email');
});