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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。