## 數據庫類型
* Sqlite3 適用于小型項目的開發,不需要安裝,上傳即可使用 (默認) 。
* Mysql 適用于中大型項目的開發,需要先刪除(./datas/db/mysql.lock)鎖定文件后在瀏覽器執行 **install.php**,照提示安裝即可。
## 數據庫配置
./apps/databse.php 為數據庫配置文件,您也可以手動配置。
## 數據庫結構
DaiCuo的數據表比較簡單,理念是采用橫向數據庫的設計思路,熟悉WordPress的朋友應該不會陌生。
* dc_info 內容基礎表
* dc_info_meta 內容擴展表
* dc_info_logo 日志記錄表
* dc_op 配置基礎表
* dc_term 隊列基礎表
* dc_term_map 隊列關系表
* dc_term_meta 隊列擴展表
* dc_user 用戶基礎表
* dc_user_meta 用戶擴展表
## 數據表擴展
* 當在開發插件應用時需要增加額外的數據表時,請將Mysql或Sqlite3的建議表句放在 應用名/event/Sql.php 里面,對應的操作有“安裝/更新/刪除 ” ,當執行應用的“安裝/升級/刪除”時將執行對應的語句達到數據表的新建、修改、刪除。
* 擴展數據表的實例:
```
//應用插件安裝時執行的腳本
public function install()
{
\think\Db::execute("DROP TABLE IF EXISTS `dc_test`;");
\think\Db::execute("CREATE TABLE `dc_test` (
`test_id` BIGINT(20) PRIMARY KEY AUTO_INCREMENT NOT NULL,
`test_name` VARCHAR(150) NOT NULL,
`test_value` LONGTEXT NULL
)ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;");
}
```
## 字段擴展
* **自建表**根據應用開發時對數據庫表字段的設計進行開發,對數據庫的操作通過DaiCuo封裝的助手函數或ThinkPhp提供的函數、模型來完成,詳見TP5的[數據庫](http://www.hmoore.net/manual/thinkphp5/118058)章節。
* **系統擴展表**可通過擴展配置custom_fields來完成,具體方法為在(應用名/config.php下),使用 DcConfigMerge 函數對上述三個擴展表的字段進行合并,只有定義后的字段,DaiCuo框架在新增、查詢、修改、刪除數據時才會做對應的處理。
```
//擴展用戶表字段
DcConfigMerge('custom_fields.user_meta', ['user_score','user_pid','wx_openid'] );
//擴展用戶組
DcConfigMerge('user_roles.subscriber', ['home/user/index'] );
```
* **系統基礎表、擴展表**還可以通過(網站后臺 > 系統>字段管理 )進行可視化管理,通過這種方式擴展的字段的好處是對數據庫操作可以直接調用呆錯公共模型類對應的write方法自動判斷新增與修改。實例如下:
```
model('common/Info','loglic')->write($post);
```
## Sqlite數據庫配置示例
如果不需要使用env開發環境就不需要引入env類。
```
use think\Env;
return [
// 數據庫類型
'type' => Env::get('database.type', 'sqlite'),
// 數據庫名
'database' => Env::get('database.database', 'datas/db/#daicuo.s3db'),
// 連接dsn
'dsn' => '',
// 數據庫連接參數
'params' => [],
// 數據庫編碼默認采用utf8
'charset' => Env::get('database.charset', 'utf8'),
// 數據庫表前綴
'prefix' => Env::get('database.prefix', 'dc_'),
// 數據庫調試模式
'debug' => Env::get('database.debug', false),
// 數據集返回類型
'resultset_type' => 'collection',
// 自動寫入時間戳字段
'auto_timestamp' => false,
// 時間字段取出后的默認時間格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要進行SQL性能分析
'sql_explain' => false,
];
```
## Mysql數據庫配置示例
如果不需要使用env開發環境就不需要引入env類。
```
use think\Env;
return [
// 數據庫類型
'type' => Env::get('database.type', 'mysql'),
// 服務器地址
'hostname' => Env::get('database.hostname', '127.0.0.1'),
// 數據庫名
'database' => Env::get('database.database', 'daicuo'),
// 用戶名
'username' => Env::get('database.username', 'root'),
// 密碼
'password' => Env::get('database.password', 'root'),
// 端口
'hostport' => Env::get('database.hostport', ''),
// 連接dsn
'dsn' => '',
// 數據庫連接參數
'params' => [],
// 數據庫編碼默認采用utf8
'charset' => Env::get('database.charset', 'utf8'),
// 數據庫表前綴
'prefix' => Env::get('database.prefix', 'dc_'),
// 數據庫調試模式
'debug' => Env::get('database.debug', false),
// 數據集返回類型
'resultset_type' => 'collection',
// 自動寫入時間戳字段
'auto_timestamp' => false,
// 時間字段取出后的默認時間格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要進行SQL性能分析
'sql_explain' => false,
];
```
## 助手函數
* dbSelect 數據查詢多個
* dbFind定義 數據查詢單個
* dbGetValue 根據條件快捷查詢某個字段的值
* dbWriteAuto 寫入多條數據自動判斷新增與修改,當數據中存在主鍵的時候會認為是更新操作,否則為新增
* dbUpdateField 更新某個字段的值
* dbUpdateInc 自增某字段的值
* dbUpdateDec 自減某字段的值
* dbUpdateAll 批量更新數據(批量更新僅能根據主鍵值進行更新,其它情況請使用foreach遍歷更新)
* dbUpdate 更新數據
* dbDelete 刪除數據
* dbInsertAll 添加多條數據
* dbInsert 添加一條數據