(2) 字段操作
最后更新于:2022-04-02 01:42:23
[TOC]
## 字段创建
`CreateUsersTable` 类中通过 `Blueprint` 实例 `$table` 为 users 表创建所需的字段:
> 由 `increments` 方法创建一个` integer` 类型的自增长 id。
~~~php
$table->increments('id');
~~~
> 由 `string` 方法创建一个 `name` 字段,用于保存用户名称。
~~~php
$table->string('name');
~~~
> 由 `string` 方法创建一个 `email` 字段,且在最后指定该字段的值为唯一值,用于保存用户邮箱。
~~~php
$table->string('email')->unique();
~~~
> 由 `string` 方法创建一个 `password` 字段,且在 `string` 方法中指定保存的值最大长度为 60,用于保存用户密码。
~~~php
$table->string('password', 60);
~~~
> 由 `rememberToken` 方法为用户创建一个 `remember_token` 字段,用于保存『记住我』的相关信息。
~~~php
$table->rememberToken();
~~~
> 由 `timestamps` 方法创建了一个 `created_at` 和一个 `updated_at` 字段,分别用于保存用户的创建时间和更新时间。
~~~php
$table->timestamps();
~~~
>[info] 该迁移文件最终生成的数据表如下:
字段名称 | 字段类型
------------- | -------------
id | integer
name | string
email | string
password | string
remember_token | string
created_at | datetime
updated_at | datetime
### 可用的字段类型
命令 | 描述
------------- | -------------
`$table->bigIncrements('id');` | 递增 ID(主键),相当于「UNSIGNED 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->dateTimeTz('created_at');` | DATETIME (带时区) 形态
`$table->decimal('amount', 5, 2);` | 相当于 DECIMAL 型态,并带有精度与基数。
`$table->double('column', 15, 8);` | 相当于 DOUBLE 型态,总共有 15 位数,在小数点后面有 8 位数。
`$table->enum('choices', ['foo', 'bar']);` | 相当于 ENUM 型态。
`$table->float('amount', 8, 2);` | 相当于 FLOAT 型态,总共有 8 位数,在小数点后面有 2 位数。
`$table->increments('id');` | 递增的 ID (主键),使用相当于「UNSIGNED INTEGER」的型态。
`$table->integer('votes');` | 相当于 INTEGER 型态。
`$table->ipAddress('visitor');` | 相当于 IP 地址形态。
`$table->json('options');` | 相当于 JSON 型态。
`$table->jsonb('options');` | 相当于 JSONB 型态。
`$table->longText('description');` | 相当于 LONGTEXT 型态。
`$table->macAddress('device');` | 相当于 MAC 地址形态。
`$table->mediumIncrements('id');` | 递增 ID (主键) ,相当于「UNSIGNED MEDIUM INTEGER」型态。
`$table->mediumInteger('numbers');` | 相当于 MEDIUMINT 型态。
`$table->mediumText('description');` | 相当于 MEDIUMTEXT 型态。
`$table->morphs('taggable');` | 加入整数 `taggable_id` 与字符串 `taggable_type`。
`$table->nullableMorphs('taggable');` | 与 `morphs()` 字段相同,但允许为NULL。
`$table->nullableTimestamps();` | 与 `timestamps()` 相同,但允许为 NULL。
`$table->rememberToken();` | 加入 `remember_token` 并使用 VARCHAR(100) NULL。
`$table->smallIncrements('id');` | 递增 ID (主键) ,相当于「UNSIGNED SMALL INTEGER」型态。
`$table->smallInteger('votes');` | 相当于 SMALLINT 型态。
`$table->softDeletes();` | 加入 `deleted_at` 字段用于软删除操作。
`$table->string('email');` | 相当于 VARCHAR 型态。
`$table->string('name', 100);` | 相当于 VARCHAR 型态,并带有长度。
`$table->text('description');` | 相当于 TEXT 型态。
`$table->time('sunrise');` | 相当于 TIME 型态。
`$table->timeTz('sunrise');` | 相当于 TIME (带时区) 形态。
`$table->tinyInteger('numbers');` | 相当于 TINYINT 型态。
`$table->timestamp('added_on');` | 相当于 TIMESTAMP 型态。
`$table->timestampTz('added_on');` | 相当于 TIMESTAMP (带时区) 形态。
`$table->timestamps();` | 加入 `created_at` 和 `updated_at` 字段。
`$table->timestampsTz();` | 加入 `created_at` and `updated_at` (带时区) 字段,并允许为NULL。
`$table->unsignedBigInteger('votes');` | 相当于 Unsigned BIGINT 型态。
`$table->unsignedInteger('votes');` | 相当于 Unsigned INT 型态。
`$table->unsignedMediumInteger('votes');` | 相当于 Unsigned MEDIUMINT 型态。
`$table->unsignedSmallInteger('votes');` | 相当于 Unsigned SMALLINT 型态。
`$table->unsignedTinyInteger('votes');` | 相当于 Unsigned TINYINT 型态。
`$table->uuid('id');` | 相当于 UUID 型态。
### 可用的字段修饰
除了上述的字段类型列表,还有一些其它的字段「修饰」,你可以将它增加到字段中。
例如,若要让字段「nullable」,那么你可以使用 `nullable` 方法:
~~~php
Schema::table('users', function (Blueprint $table) {
$table->string('email')->nullable();
});
~~~
修饰 | 描述
------------- | -------------
`->after('column')` | 将此字段放置在其它字段「之后」(仅限 MySQL)
`->comment('my comment')` | 增加注释
`->default($value)` | 为此字段指定「默认」值
`->first()` | 将此字段放置在数据表的「首位」(仅限 MySQL)
`->nullable()` | 此字段允许写入 NULL 值
`->storedAs($expression)` | 创建一个存储的生成字段 (仅限 MySQL)
`->unsigned()` | 设置 `integer` 字段为 `UNSIGNED`
`->virtualAs($expression)` | 创建一个虚拟的生成字段 (仅限 MySQL)
>[warning] 此列表不包括 [索引修饰](database/indexes.md)
## 字段修改
### 先决条件
>[danger] 在修改字段之前,请**务必**在你的 `composer.json` 中增加 `doctrine/dbal` 依赖。
>[info] Doctrine DBAL 函数库:
用来判断当前字段的状态,以及创建调整指定字段的 SQL 查询。
~~~shell
$ composer require doctrine/dbal
// 或修改 composer.json 文件后执行
$ composer update
~~~
### 更改字段类型或属性:实例 `$table` 的 `change` 方法
例子:
1. 增加字符串字段的长度,把 `name` 字段的长度从 25 增加到 50 :
~~~php
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->change();
});
~~~
2. 将字段修改为 nullable:
~~~php
Schema::table('users', function (Blueprint $table) {
$table->string('name', 50)->nullable()->change();
});
~~~
>[danger] 下面的字段类型不能被「修改」:
char,double,enum,mediumInteger,timestamp,tinyInteger,ipAddress,json,jsonb,macAddress,mediumIncrements,morphs,nullableMorphs,nullableTimestamps,softDeletes,timeTz,timestampTz,timestamps,timestampsTz,unsignedMediumInteger,unsignedTinyInteger,uuid。
### 重命名字段:实例 `$table` 的 `renameColumn` 方法
~~~php
Schema::table('users', function (Blueprint $table) {
$table->renameColumn('from', 'to');
});
~~~
### 删除字段:实例 `$table` 的 `dropColumn` 方法
~~~php
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('votes');
});
~~~
#### 删除多个字段:传递多个字段的数组至 `dropCloumn` 方法
~~~php
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['votes', 'avatar', 'location']);
});
~~~
>[warning] SQLite 数据库不支持在单个迁移中删除或修改多个字段。
#### 可用的删除命令
命令 | 描述
--- | ---
`$table->dropRememberToken();` | 删除 `remember_token` 字段。
`$table->dropSoftDeletes();` | 删除用于软删除操作 `deleted_at` 字段。
`$table->dropSoftDeletesTz();` | 删除 `deleted_at` 字段。
`$table->dropTimestamps();` | 删除 `created_at` 和 `updated_at` 字段。
`$table->dropTimestampsTz();` | 删除 `created_at` 和 `updated_at` 字段。
';