## 數據庫
很多時候我們的FastAdmin插件都需要使用到數據庫,此篇幅為你解答如何在FastAdmin插件中使用數據庫功能。
## 設計規范
我們在設計插件數據庫時建議統一設計規范,因為更好的設計規范能更好的讓我們的用戶更快速的掌握我們開發者的設計思想。
1. 表名和字段名全小寫,只允許出現`a-z`和`_`這幾種字符,且不能有拼音,只能為英文單詞\
2. 存儲引擎統一使用`innodb`引擎
3. 字符集統一使用`utf8mb4`,排序規則使用`utf8mb4_general_ci`
4. 關聯字段統一使用`_id`結尾,如`user_id`、`task_id`(任務表名為task),`item_id`(物品表名為item), 當為`father_id`、`parent_id`、`pid`、`prev_id`等字段時表示和當前表主鍵進行關聯,當為`task_ids`、`user_ids`時表示一個集合,以半角逗號進行分隔(非JSON)
5. 時間統一使用`Unix時間戳`格式, 秒級, 長整型, 長度16,且必須以`time`結尾, 如`createtime`、`updatetime`,`paytime`、`expiretime`等
6. 時長統一使用秒格式, 整型, 長度10,且必須以`seconds`結尾,如`onlineseconds`、`todayonlineseconds`等
7. 表主鍵必須為`id`,主索引
8. 表名和字段名統一使用英文名稱,不允許出現中英混搭的情況出現
9. 日志表統一為模塊名加上`_log`進行命名
10. 字段內容為`json`數據時,以`data`進行結尾,比如`itemdata`、`rewarddata`
11. 當字段為某操作數量時,以`nums`結尾,比如`buynums`、`salenums`
12. 當一表出現兩個或兩個以上會員ID時,`user_id`表示自己,`receiver_user_id`表示他人,多人時使用`receiver_user_ids`,以半角逗號進行分隔(非JSON)
13. 當出現可數名詞字段時,一定要加上字符`s`,如`comments`、`views`等
14. 數據表添加的索引對應的字段長度不建議超過100
## 配置文件
在插件目錄`addons/mydemo`目錄添加一個`install.sql`,然后將安裝腳本的SQL存放在此文件中。
## 數據表名規范
插件數據表名必須以`插件標識`開始,例如:
~~~markdown
__PREFIX__mydemo_log
__PREFIX__mydemo_item
__PREFIX__mydemo_comment
~~~
其中`mydemo`為你的插件標識,`__PREFIX__`為數據表前綴。
## 特殊字段
建議開發者在設計數據庫時保留以下字段的設計名稱,這樣我們能更好的統一不同插件之間的命名規范。
| 字段 ? ? ? ? | 字段名稱 ? | 字段類型 | 字段說明 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| --- | --- | --- | --- |
| category\_id ? | 分類ID ? ? | int ? ? ? | 關聯`fa_category`表,后臺CRUD時會自動生成selectpage組件 ? ? ? |
| user\_id | 會員ID | int ? | 關聯`fa_user`表,后臺CRUD時會自動生成selectpage組件 ? ? ? |
| weigh ? ? ? ? | 權重 ? ? ? | int ? ? ? | 后臺的排序字段,如果存在該字段將出現排序按鈕,可上下拖動進行排序 |
| createtime ? | 創建時間 ? | bigint ? ? ? | 記錄添加時間字段,不需要手動維護 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| updatetime ? | 更新時間 ? | bigint ? ? ? | 記錄更新時間的字段,不需要手動維護 ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| deletetime ? | 刪除時間 ? | bigint ? ? ? | 記錄刪除時間的字段,不需要手動維護,如果存在此字段將會生成回收站功能,字段默認值務必為null |
| status ? ? ? | 狀態字段 ? | enum ? ? | 狀態標識,如果存在此字段將啟用TAB選項卡展示列表 ? ? ? ? ? |
## 安裝腳本
每個插件都可以自帶一個`install.sql`,路徑位于`addons/mydemo/install.sql`,用于在插件安裝時,FastAdmin插件系統會自動執行此文件中的SQL,可用于創建數據庫,寫入相關數據等操作。以下為示例的SQL:
~~~sql
CREATE TABLE IF NOT EXISTS `__PREFIX__mydemo_list` (
?`id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',
?`pid` int(10) DEFAULT NULL COMMENT '父id',
?`title` varchar(100) DEFAULT NULL COMMENT '標題',
?`name` varchar(100) DEFAULT NULL COMMENT '名稱',
?`createtime` bigint(16) DEFAULT NULL COMMENT '創建時間',
?`updatetime` bigint(16) DEFAULT NULL COMMENT '更新時間',
?`publishtime` bigint(16) DEFAULT NULL COMMENT '發布時間',
?`deletetime` bigint(16) DEFAULT NULL COMMENT '刪除時間',
?`memo` varchar(100) DEFAULT '' COMMENT '備注',
?`status` enum('normal','hidden','rejected','pulloff') NOT NULL DEFAULT 'normal' COMMENT '狀態',
?PRIMARY KEY (`id`),
?KEY `pid` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='示例表';
~~~
`__PREFIX__`用于將在執行導入時自動替換為用戶數據庫配置的表前綴。
如果在版本升級時插件表結構需要變更,需要在`install.sql`追加變更的SQL語句,如
~~~sql
--
-- 1.0.1
-- 添加名稱字段name
--
ALTER TABLE `__PREFIX__mydemo_list` ADD COLUMN `name` varchar(255) NULL DEFAULT '' COMMENT '名稱' AFTER `title`;
~~~
同時注意上方的`CREATE TABLE IF NOT EXISTS __PREFIX__mydemo_list`語句中字段`name`的創建也需要存在。
## 測試數據
每個插件可自帶一個`testdata.sql`,用于安裝插件成功后導入測試數據,具體文檔請參考測試數據
章節。
## 溫馨提示
1.**不允許修改框架自帶的數據表結構或其它應用插件的數據表結構**。
2. 安裝腳本中不能包含`DROP TABLE`刪除表和`DELETE FROM`刪除記錄的語句。
3. 如果需要測試數據,請參考`測試數據`章節
4. 日期時間如使用時間戳,請使用`bigint(16)`類型,且設置默認為`NULL`