结构生成器
介绍
Laravel 的 结构生成器
提供一个数据库无关的操作数据库表方法(即不关心应用将使用何种数据库,只考虑数据表架构操作),它可以让 Laravel 很好的支持各种数据库类型,并且能在不同系统间提供一致性的 API 操作。
建立与删除数据库表
要建立一个新的数据库表,可使用 Schema::create
方法:
Schema::create('users', function($table)
{
$table->increments('id');
});
传入 create
方法的第一个参数是数据库表名称,第二个参数是 Closure
并接收 Blueprint
对象被用来定义新的数据库表。
要修改数据库表名称,可使用 rename
方法:
Schema::rename($from, $to);
要指定特定连接来操作,可使用 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->bigIncrements('id'); | ID 自动增量,使用相当于 "big integer" 类型. |
$table->bigInteger('votes'); | 相当于 BIGINT 类型 |
$table->binary('data'); | 相当于 BLOB 类型 |
$table->boolean('confirmed'); | 相当于 BOOLEAN 类型 |
$table->char('name', 4); | 相当于 CHAR 类型 |
$table->date('created_at'); | 相当于 DATE 类型 |
$table->dateTime('created_at'); | 相当于 DATETIME 类型 |
$table->decimal('amount', 5, 2); | 相当于 DECIMAL 类型,并带有精度与数值范围 |
$table->double('column', 15, 8); | 相当于 DOUBLE 类型,总共 15 位数,其中小数 8 位 |
$table->enum('choices', array('foo', 'bar')); | 相当于 ENUM 类型 |
$table->float('amount'); | 相当于 FLOAT 类型 |
$table->increments('id'); | 相当于 Incrementing 类型(数据库表主键) |
$table->integer('votes'); | 相当于 INTEGER 类型 |
$table->longText('description'); | 相当于 LONGTEXT 类型 |
$table->mediumInteger('numbers'); | 相当于 MEDIUMINT 类型 |
$table->mediumText('description'); | 相当于 MEDIUMTEXT 类型 |
$table->morphs('taggable'); | 加入整数 taggable_id 与字串 taggable_type |
$table->nullableTimestamps(); | 与 timestamps() 相同,但允许 NULL |
$table->smallInteger('votes'); | 相当于 SMALLINT 类型 |
$table->tinyInteger('numbers'); | 相当于 TINYINT 类型 |
$table->softDeletes(); | 加入 deleted_at 字段于软删除使用 |
$table->string('email'); | 相当于 VARCHAR 类型 equivalent column |
$table->string('name', 100); | 相当于 VARCHAR 类型,并指定长度 |
$table->text('description'); | 相当于 TEXT 类型 |
$table->time('sunrise'); | 相当于 TIME 类型 |
$table->timestamp('added_on'); | 相当于 TIMESTAMP 类型 |
$table->timestamps(); | 加入 created_at 和 updated_at 字段 |
$table->rememberToken(); | 加入 remember_token 使用 VARCHAR(100) NULL |
->nullable() | 标示此字段允许 NULL |
->default($value) | 定义此字段的默认值 |
->unsigned() | 设定整数是无分正负 |
在 MySQL 使用 After 方法
若您使用 MySQL 数据库,您可以使用 after
方法来指定字段的顺序:
$table->string('name')->after('email');
修改字段名称
要修改字段名称,可在结构生成器内使用 renameColumn
方法,请确认在修改前 composer.json
文件内已经加入 doctrine/dbal
。
Schema::table('users', function($table)
{
$table->renameColumn('from', 'to');
});
注意:
enum
字段类型不支持修改字段名称
移除字段
要移除字段,可在结构生成器内使用 dropColumn
方法,请确认在移除前 composer.json
文件内已经加入 doctrine/dbal
。
移除数据库表字段
Schema::table('users', function($table)
{
$table->dropColumn('votes');
});
移除数据库表多个字段
Schema::table('users', function($table)
{
$table->dropColumn(array('votes', 'avatar', 'location'));
});
检查是否存在
检查数据库表是否存在
您可以轻松的检查数据库表或字段是否存在,使用 hasTable
和 hasColumn
方法:
if (Schema::hasTable('users'))
{
//
}
检查字段是否存在
if (Schema::hasColumn('users', 'email'))
{
//
}
加入索引
结构生成器支持多种索引类型,有两种方法可以加入,方法一,您可以在定义字段时顺道附加上去,或者是分开另外加入:
$table->string('email')->unique();
或者,您可以独立一行来加入索引,以下是支持的索引类型:
命令 | 功能描述 |
---|---|
$table->primary('id'); | 加入主键 |
$table->primary(array('first', 'last')); | 加入复合键 |
$table->unique('email'); | 加入唯一索引 |
$table->index('state'); | 加入基本索引 |
外键
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
方法。外键的命名约定如同其他索引:
$table->dropForeign('posts_user_id_foreign');
注意: 当外键有参照到自动增量时,记得设定外键为
unsigned
类型。
移除索引
要移除索引您必须指定索引名称,Laravel 默认有脉络可循的索引名称。简单地链接这些数据库表与索引的字段名称和类型。举例如下:
命令 | 功能描述 |
---|---|
$table->dropPrimary('users_id_primary'); | 从 "users" 数据库表移除主键 |
$table->dropUnique('users_email_unique'); | 从 "users" 数据库表移除唯一索引 |
$table->dropIndex('geo_state_index'); | 从 "geo" 数据库表移除基本索引 |
移除时间戳记和软删除
要移除 timestamps
, nullableTimestamps
或 softDeletes
字段类型,您可以使用以下方法:
命令 | 功能描述 |
---|---|
$table->dropTimestamps(); | 移除 created_at 和 updated_at 字段 |
$table->dropSoftDeletes(); | 移除 deleted_at 字段 |
储存引擎
要设定数据库表的储存引擎,可在结构生成器设定 engine
属性:
Schema::create('users', function($table)
{
$table->engine = 'InnoDB';
$table->string('email');
});