Laravel 的結(jié)構(gòu)生成器 (Schema
) 提供一個與數(shù)據(jù)庫無關(guān)的數(shù)據(jù)表產(chǎn)生方法,它可以很好的處理 Laravel 支持的各種數(shù)據(jù)庫類型,并且在不同系統(tǒng)間提供一致性的 API 操作。
要建立一個新的數(shù)據(jù)表,可使用 Schema::create
方法:
Schema::create('users', function($table){ $table->increments('id');});
傳入 create
方法的第一個參數(shù)是數(shù)據(jù)表名稱,第二個參數(shù)是 Closure
并接收 Blueprint
對象被用來定義新的數(shù)據(jù)表。
要修改數(shù)據(jù)表名稱,可使用 rename
方法:
Schema::rename($from, $to);
要指定特定連接來操作,可使用 Schema::connection
方法:
Schema::connection('foo')->create('users', function($table){ $table->increments('id');});
要移除數(shù)據(jù)表,可使用 Schema::drop
方法:
Schema::drop('users');Schema::dropIfExists('users');
更新現(xiàn)有的數(shù)據(jù)表,可使用 Schema::table
方法:
Schema::table('users', function($table){ $table->string('email');});
數(shù)據(jù)表產(chǎn)生器提供多種字段類型可使用,在您建立數(shù)據(jù)表時也許會用到:
命令 | 功能描述 |
---|---|
$table->bigIncrements('id');
| ID 自動增量,使用相當(dāng)于「big integer」類型 |
$table->bigInteger('votes');
| 相當(dāng)于 BIGINT 類型 |
$table->binary('data');
| 相當(dāng)于 BLOB 類型 |
$table->boolean('confirmed');
| 相當(dāng)于 BOOLEAN 類型 |
$table->char('name', 4);
| 相當(dāng)于 CHAR 類型,并帶有長度 |
$table->date('created_at');
| 相當(dāng)于 DATE 類型 |
$table->dateTime('created_at');
| 相當(dāng)于 DATETIME 類型 |
$table->decimal('amount', 5, 2);
| 相當(dāng)于 DECIMAL 類型,并帶有精度與基數(shù) |
$table->double('column', 15, 8);
| 相當(dāng)于 DOUBLE 類型,總共有 15 位數(shù),在小數(shù)點(diǎn)后面有 8 位數(shù) |
$table->enum('choices', array('foo', 'bar'));
| 相當(dāng)于 ENUM 類型 |
$table->float('amount');
| 相當(dāng)于 FLOAT 類型 |
$table->increments('id');
| 相當(dāng)于 Incrementing 類型 (數(shù)據(jù)表主鍵) |
$table->integer('votes');
| 相當(dāng)于 INTEGER 類型 |
$table->json('options');
| 相當(dāng)于 JSON 類型 |
$table->jsonb('options');
| JSONB equivalent to the table |
$table->longText('description');
| 相當(dāng)于 LONGTEXT 類型 |
$table->mediumInteger('numbers');
| 相當(dāng)于 MEDIUMINT 類型 |
$table->mediumText('description');
| 相當(dāng)于 MEDIUMTEXT 類型 |
$table->morphs('taggable');
| 加入整數(shù) taggable_id 與字串 taggable_type
|
$table->nullableTimestamps();
| 與 timestamps() 相同,但允許 NULL |
$table->smallInteger('votes');
| 相當(dāng)于 SMALLINT 類型 |
$table->tinyInteger('numbers');
| 相當(dāng)于 TINYINT 類型 |
$table->softDeletes();
| 加入 deleted_at 字段于軟刪除使用 |
$table->string('email');
| 相當(dāng)于 VARCHAR 類型 |
$table->string('name', 100);
| 相當(dāng)于 VARCHAR 類型,并指定長度 |
$table->text('description');
| 相當(dāng)于 TEXT 類型 |
$table->time('sunrise');
| 相當(dāng)于 TIME 類型 |
$table->timestamp('added_on');
| 相當(dāng)于 TIMESTAMP 類型 |
$table->timestamps();
| 加入 created_at 和 updated_at 字段 |
$table->rememberToken();
| 加入 remember_token 使用 VARCHAR(100) NULL |
->nullable()
| 標(biāo)示此字段允許 NULL |
->default($value)
| 聲明此字段的默認(rèn)值 |
->unsigned()
| 配置整數(shù)是無分正負(fù) |
若您使用 MySQL 數(shù)據(jù)庫,您可以使用 after
方法來指定字段的順序:
$table->string('name')->after('email');
注意: 當(dāng)修改一個字段前,確保已經(jīng)將 doctrine/dbal
這個依賴添加至你的 composer.json
文件中。
有時候您需要修改一個存在的字段,例如:您可能想增加保存文本字段的長度。通過 change
方法讓這件事情變得非常容易!假設(shè)我們想要將字段 name
的長度從 25 增加到 50 的時候:
Schema::table('users', function($table){ $table->string('name', 50)->change();});
另外也能將某個字段修改為允許 NULL:
Schema::table('users', function($table){ $table->string('name', 50)->nullable()->change();});
要修改字段名稱,可在結(jié)構(gòu)生成器內(nèi)使用 renameColumn
方法,請確認(rèn)在修改前 composer.json
文件內(nèi)已經(jīng)加入 doctrine/dbal
。
Schema::table('users', function($table){ $table->renameColumn('from', 'to');});
注意: 目前暫時還不支持修改表中的結(jié)構(gòu)為
enum
字段類型。
要移除字段,可在結(jié)構(gòu)生成器內(nèi)使用 dropColumn
方法,請確認(rèn)在移除前 composer.json
文件內(nèi)已經(jīng)加入 doctrine/dbal
。
Schema::table('users', function($table){ $table->dropColumn('votes');});
Schema::table('users', function($table){ $table->dropColumn(['votes', 'avatar', 'location']);});
您可以輕松的檢查數(shù)據(jù)表或字段是否存在,使用 hasTable
和 hasColumn
方法:
if (Schema::hasTable('users')){ //}
if (Schema::hasColumn('users', 'email')){ //}
結(jié)構(gòu)生成器支持多種索引類型,有兩種方法可以加入,方法一,您可以在定義字段時順便附加上去,或者是分開另外加入:
$table->string('email')->unique();
或者,您可以獨(dú)立一行來加入索引,以下是支持的索引類型:
命令 | 功能描述 |
---|---|
$table->primary('id');
| 加入主鍵 (primary key) |
$table->primary(array('first', 'last'));
| 加入復(fù)合鍵 (composite keys) |
$table->unique('email');
| 加入唯一索引 (unique index) |
$table->index('state');
| 加入基本索引 (index) |
Laravel 也支持?jǐn)?shù)據(jù)表的外鍵約束:
$table->integer('user_id')->unsigned();$table->foreign('user_id')->references('id')->on('users');
例子中,我們關(guān)注字段 user_id
參照到 users
數(shù)據(jù)表的 id
字段。請先確認(rèn)已經(jīng)建立外鍵!
您也可以指定選擇在「on delete」和「on update」進(jìn)行約束動作:
$table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade');
要移除外鍵,可使用 dropForeign
方法。外鍵的命名約定如同其他索引:
$table->dropForeign('posts_user_id_foreign');
注意: 當(dāng)外鍵有參照到自動增量時,記得配置外鍵為
unsigned
類型。
要移除索引您必須指定索引名稱,Laravel 默認(rèn)有脈絡(luò)可循的索引名稱。簡單地鏈接這些數(shù)據(jù)表與索引的字段名稱和類型。舉例如下:
命令 | 功能描述 |
---|---|
$table->dropPrimary('users_id_primary');
| 從「users」數(shù)據(jù)表移除主鍵 |
$table->dropUnique('users_email_unique');
| 從「users」數(shù)據(jù)表移除唯一索引 |
$table->dropIndex('geo_state_index');
| 從「geo」數(shù)據(jù)表移除基本索引 |
要移除 timestamps
、nullableTimestamps
或 softDeletes
字段類型,您可以使用以下方法:
命令 | 功能描述 |
---|---|
$table->dropTimestamps();
| 移除 created_at 和 updated_at 字段 |
$table->dropSoftDeletes();
| 移除 deleted_at 字段 |
要配置數(shù)據(jù)表的保存引擎,可在結(jié)構(gòu)生成器配置 engine
屬性:
Schema::create('users', function($table){ $table->engine = 'InnoDB'; $table->string('email');});
更多建議: