https://www.jianshu.com/p/894662846d8c
## 通过本文你可以学到:
* 表的方法
* 列的方法
* 自定义主键名
* 自定义时间戳字段名
* 增加软删除 `softDelete` 字段
上一篇文章中,作者给大家简单的介绍了 `Migration` 的使用,但是较为浅薄不够深入,很多小伙伴看完肯定意犹未尽,这篇文章就给小伙伴们深入的介绍 `Migration` 的使用咯。
## 表的方法
看过上一篇文章中我们都知道,在 `Migration` 文件中,我们通过:
~~~
$userTable = $this->table('users');
~~~
获取了表 `users` 的实例,获取这个实例之后我们就可以做很多关于表的操作咯,比如说下面这样:
~~~
$table->addColumn('nickname', 'string', ['limit' => 16, 'null' => false])
->addColumn('email', 'string', ['limit' => 32, 'null' => false])
->addColumn('password', 'string', ['limit' => 64, 'null' => false])
->setEngine('InnoDB')
->comment('用户表');
->create();
~~~
给表 `users` 增加三个字段,并指定使用 `InnoDB` 存储引擎,且给表打上 `用户表` 的注释。这是一个简单的实例,关于表的操作方法主要有下面这些方法:
| 方法 | 说明 |
| --- | --- |
| `setId(string $id)` | 设置主键字段名 |
| `setPrimaryKey(string $key)` | 设置主键 |
| `setEngine(string $engine)` | 设置存储引擎,有:`InnoDB`,`MyISAM` |
| `setComment(string $comment)` | 设置表注释 |
| `addTimestamps(string $createAtName, string $updateAtName)` | 给表加上**创建时间**和**编辑时间**两个字段,默认字段名是:`create_time`,`update_time` |
| `addColumn($columnName, $type, $options)` | 给表增加一个字段 |
| `changeColumn($columnName, $newType, $options)` | 改变表的某一个字段的属性 |
| `create()` | 创建表 |
| `save()` | 保存表 |
| `rename($newTableName)` | 重命名表名 |
| `hasTable($tableName)` | `exists()` | 判断表是否存在 |
| `drop()` | 删除当前表 |
| `setIndexes(array $indexs)` | 批量设置索引 |
| `setForeignKeys(array $foreignKeys)` | 设置外键 |
| `removeColumn($columnName)` | 删除字段 |
| `renameColumn($oldName, $newName)` | 字段重命名 |
| `insert(array $data)` | 插入数据 |
## 列的方法
列我们主要从 `addColumn($columnName, $type, $options)` 这个方法的参数讲起,第一个参数:
### 参数一:列名
> 其实这里叫列名并不准确,但是我们姑且叫做列名,本着入门的原则,这里不过多的深入。
它的结构非常简单,字符串类型,符合Mysql的列名规范就可以啦,其它没有要说的。
### 参数二:列类型
到目前为止,可以支持下面这些类型:
| 类型 |
| --- |
| `biginteger` |
| `binary` |
| `boolean` |
| `date` |
| `datetime` |
| `decimal` |
| `float` |
| `integer` |
| `string` |
| `text` |
| `time` |
| `timestamp` |
| `uuid` |
当MysqlVersion >= 5.7的时候,还有下面的类型:
| 类型 |
| --- |
| `enum` |
| `set` |
| `blob` |
| `json` |
好咯,类型就说到这里了,自己对号入座。
### 参数三:可选参数
**下面是所有字段类型均支持的可选参数:**
| 参数 | 说明 |
| --- | --- |
| `limit` | 长度限制,整数 |
| `length` | 同 `limit`,整数 |
| `default` | 默认值,mixed |
| `null` | 是否可空,bool |
| `after` | 在哪个字段后 |
| `comment` | 注释 |
**下面是针对 `decimal` 类型:**
| 参数 | 说明 |
| --- | --- |
| `precision` | 长度,整数 |
| `scale` | 小数位长度,整数 |
| `signed` | 是否无符号,bool |
**下面是针对 `enum` 和 `set` 类型:**
| 参数 | 说明 |
| --- | --- |
| `values` | 默认值 |
**下面是针对 `integer` 和 `biginteger` 类型:**
| 参数 | 说明 |
| --- | --- |
| `identity` | 自动递增,bool,默认false |
| `signed` | 无符号,bool |
**下面是针对 `timestamp` 类型:**
| 参数 | 说明 |
| --- | --- |
| `default` | 默认值,如:`CURRENT_TIMESTAMP` |
| `update` | 字段更新时的动作,如:`CURRENT_TIMESTAMP` |
好咯,列就说到这里啦。
## 自定义主键
看过上一篇的小伙伴们都知道,默认情况系统会给我们自动加上 `id` 字段的主键,但是如果我们想使用 `uid` 怎么办呢?可以这样:
~~~
$table = $this->table('users');
$table->setId('uid');
~~~
这样就可以啦。
## 自定义时间戳字段名
执行 `addTimestamps()` 方法系统会为我们自动加上 `create_time` 和 `update_time` 两个字段,但是如果是从 `laravel` 转过来的用户,肯定不习惯这个命名咯,想使用 `created_at` 和 `updated_at` 是最好不过啦,于是可以这样:
~~~
$table = $this->table('users');
$table->addTimestamps('created_at', 'updated_at');
~~~
注意,虽然这里修改了,但是你还需要修改下模型的文件,因为系统默认是 `create_time` 和 `update_time` ,比如说我们有个 `User` 模型,可以这样:
~~~
<?php
namespace app\common\model;
use think\Model;
class User extends Model
{
// 创建时间字段
protected $createTime = 'created_at';
// 更新时间字段
protected $updateTime = 'updated_at';
}
~~~
## 增加软删除 `softDelete` 字段
项目中有一些表的数据是不能直接删除的,只是修改成了不显示的状态,而 `softDelete` 的方案就很好的解决这个问题不仅可以标记记录的删除状态还记住了记录删除的时候,所以如果想要添加 `softDelete` 可以这样:
~~~
$table = $this->table('users');
$table->addSoftDelete();
~~~
系统为我们提供的方法并不是很友好,因为它的字段名默认就是 `delete_time` 而且无法修改,所以这种方法并不推荐,可以手动的添加:
~~~
$table = $this->table('users');
$table->addColumn('delete_time', 'timestamp', ['null' => true]);
~~~
好了今天的教程就到这里啦。此篇是小滕的《Thinkphp5入门系列课程》第十二课:Migration(二)。
喜欢的给个订阅呗!
**由于作者水平有限,如有错误请欢迎指正。**
作者:小滕Tt
链接:https://www.jianshu.com/p/894662846d8c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。