[TOC]
## **路由配置**
### **配置文件地址**
```
project 應用部署目錄
├─conf 配置文件目錄
│ └─db.php 數據庫配置信息
```
### **配置內容**
>[info]配置信息采用數組模式 多數據庫模式采用添加數組模式實現
```
<?php
return [
'mysql' => [
[
'host' => '127.0.0.1', // 服務器地址
'name' => 'dbname', // 數據庫名
'user' => 'dbroot', // 用戶名
'pwd' => 'dbpassword', // 密
'prefix' => 'dh_', // 數據庫表前綴
'port' => '3309', // 端口
'dsn' => '',
'params' => '',
'charset' => 'utf8mb4',
'read_write_power' => 0, // 讀寫權限 0讀寫 1只寫 2只讀
'error_log' => true, // 是否開啟錯誤Sql保存
'sql_explain' => true, // 開啟sql性能查詢
],
],
];
```
### 數據庫讀寫分離配置
>通過配置多個數據庫信息 調整·read_write_power·值實現讀寫分離操作
```
<?php
return [
'mysql' => [
[
...
'read_write_power' => 1, // 讀寫權限 0讀寫 1只寫 2只讀
...
],
[
...
'read_write_power' => 2, // 讀寫權限 0讀寫 1只寫 2只讀
...
],
],
];
```
## **數據庫操作**
### **創建數據庫鏈接**
>調用數據庫操作類
先引用類庫 `use denha\Db;`
執行方法 `Db::table('user')`
或者執行方法 `Db::table('dh_user',['is_prefix'=>false])`
或者執行 `Db::connection()->table('user')`
最終以上方式都可以鏈接數據表 `表前綴user`
### **鏈接指定數據庫信息**
`Db::connection($type,$config)->table('user')`
`(string)type`指定名稱 `(array)$config` 數據庫配置信息
type類型值 | config值
| --- |--|
|mysql|詳見#配置內容
|sqlite|
#### **
### **where 條件篩選操作**
`where($where, $value = null, $exp = null, $mapLink = 'AND')`
#### 篩選類型
| 類型 | 值 | 例:普通 | 例:數組 |
| --- | --- | -- | -- |
| > | > | where('id','>',string) | $map['id] = ['>',string] |
| < | < | where('id','<',string) | $map['id] = ['<',string] |
| >= | >= | where('id','>=',string) | $map['id] = ['>=',string] |
| <= | <= | where('id','<=',string) | $map['id] = ['<=',string] |
| != | != | where('id','!=',string) | $map['id] = ['!=',string] |
| <> | <> | where('id','<>',string) | $map['id] = ['<>',string] |
| = | = | where('id','=',string) or where('id',string)| $map['id] = ['=',string] or $map['id] = string|
| like | like | where('id','like','%string%') | $map['id] = ['like','%string%'] |
| instr| instr|where('id','instr',string) | $map['id] = ['instr',string] |
| locate| instr|where('id','locate',string) | $map['id] = ['local',string] |
| in | in | where('id','in',array) | $map['id] = ['in',array] |
| not in| not in | where('id','not in',array) | $map['id] = ['not in',array] |
| not insrt| not insrt| where('id','not insrt',string) | $map['id] = ['not insrt',string] |
| find_in_set| find_in_set| where('id','find_in_set',string) | $map['id] = ['find_in_set',string] |
|or|or|where('id','or',['>=',string])|$map['id'] = ['or','id',array('>=',string)
#### = 篩選
`Db::table('user')->where('id',1)->find()`
執行結果SQL:`SELECT * FROM 表前綴_user WHERE `id` = '1' LIMIT 1`
#### in 篩選
`Db::table('user')->where('id','in',['1','2','3'])->select();`·
執行結果SQL:`SELECT * FROM 表前綴_user WHERE `id` in ('1','2','3')`
#### between篩選
`Db::table('user')->where('created','between',['1000','2000'])->select()`
執行結果SQL:`SELECT * FROM 表前綴_user WHERE `created` between '1000' AND '2000'`
#### 組合查詢
`Db::table('user')->where('id',1)->where('status',1)->find()`
執行SQL:`SELECT * FROM 表前綴_user WHERE `id` = '1' AND `status` = '1' LIMIT 1`
#### 數組組合查詢
```
$map = [];
$map['id'] = 1;
$map['status'] = ['in', '1,2'];
$map['created'] = ['between', ['1000', '2000']];
table('user')->where($map)->select();
```
執行SQL:`SELECT * FROM 表前綴_user WHERE `id` = '1' AND `status` in ('1','2') AND `created` between '1000' AND '2000'`
### **Filed 字段查詢操作**
`Db::table('user')->field('id,name')->find();`
指定查詢id和name
### **Join 鏈接操作**
`Db::table('user as u')->join('表前綴_user_shop as ust','u.id = ust.uid','left')->select();`
連表查詢 join必須指定全表名
### **Limit 分頁操作**
指定顯示條數一般配合Select使用 Find 默認值顯示一條
`Db::table('user')->where($map)->limit(25,25)->select();`
### **Group 分組操作**
合并展示操作
`Db::table('user')->where($map)->group('name')->select();`
### **Order 排序操作**
#### 字符串模式
`Db::table('user')->order('id desc,status asc,rand()')->select();`
#### 數組模式
`Db::table('user')->order(['id'=>'desc','status'=>'asc']->order('rand()')->select();`
### **Having 操作**
`Db::table('user')->where($map)->group('name')->having('SUM(moeny) >= 100')->select();`
### **OR 操作**
`Db::table('user')->where('id',int)->where('name','or',string)->where('tel','!=',string)->where('sex',int)->find();`
```
$sql = Select * from user where `id` = int ( and `name` = string or `tel` != stirng ) and `sex` = int limit 1
```
### **Query sql執行操作**
```
$sql = 'SELECT * FROM user WHERE `id` = 1';
```
### **Find 單條記錄查詢**
```
// 指定字段顯示的兩種寫法
Db::table('user')->find('id,name');
Db::table('user')->field('id,name')->find();
```
指定字段查詢一條記錄
### **Value 單條記錄單個字段查詢**
`Db::table('user')->where($map)->value('id')`
返回 id值
### **Lists單條記錄數組返回**
`Db::table('user')->where($map)->lists('id,name')`
返回 ['id','name'];
配合list() 使用直接賦值
`list($id,$name) = Db::table('user')->where($map)->lists('id,name');`
可以直接使用`$id` `$name`
### **Select 多條記錄查詢**
`Db::table('user')->where($map)->select()`
查詢多條記錄值
### **Column 多條記錄單個字段查詢**
```
如果field是單個字段 則返回一位數組
Db::table('user')->where($map)->column('id')
返回數據 ['1','2','3'...]
如果field是兩個字段 則第一個字段為value 第二個字段為key
Db::table('user')->where($map)->column('name,id')
返回數據 ['1'=>'abc','2'=>'abc','3'=>'abcde'...]
如果field是兩個字段以上 最后一個字段作為key 所有字段作為key的一維數組
需要注意key值重復的情況下按按順行覆蓋同名key
Db::table('user')->where($map)->column('id,sex,name')
返回數據 ['abc'=>['id'=>1,'name'=>'abc','sex'=>0],'abcde'=>['id'=>3,'name'=>'abcde','sex'=>1]...]
如果需要返回所有數據并指定key值參考上一條語句
Db::table('user')->where($map)->column('*,name')
返回數據 ['abc'=>['id'=>1,'name'=>'abc','sex'=>0],'abcde'=>['id'=>3,'name'=>'abcde','sex'=>1]...]
```
### **Count 獲取記錄條數**
`Db::table('user')->where($map)->count();`
獲取指定表和查詢條件的所有記錄
### **Add 插入新數據記錄**
```
$data = [];
$data['name'] = 111;
$data['money'] = 0;
$data['status'] = 1;
Db::table('user')->add($data);
```
>添加一條新記錄記錄值
### **Save 更新數據記錄**
#### 單個字段更新
`Db::table('user')->where($map)->save('name','abc');`
更新查詢調整修改記錄的name為abc
#### 普通多字段更新
```
$data = [];
$data['name'] = 111;
$data['money'] = ['less',1];
$data['status'] = 1;
Db::table('user')->where($map)->save($data);
```
#### 自增更新
`Db::table('user')->where($map)->save('money','add',int);`
>用戶金額自增N值 n=數字
#### 自減更新
`Db::table('user')->where($map)->save('money','less',int);`
### **Type 指定字段值類型**
`type($name,$type)`
#### type類型參數
| 類型 | 值 | 備注
| --- | --- | -- | -- |
|int|PDO::PARAM_INT | 數字類型
|str|PDO::PARAM_STR | 字符串類型
|null|PDO::PARAM_NULL| null類型
|bool|PDO::PARAM_BOOL|布爾類型
|lob|PDO::PARAM_LOB|大數據類型
>默認是 PDO::PARAM_STR 字符串類型
例子
```
Db::table('user')->where(['status'=>1])->find();
// 當前Sql: SELECT * from 表前綴user where status= '1' limit 1 查詢的時候status是查詢的字符串
// 如果status要做數字類型查詢
Db::table('user')->where(['status'=>1])->type('status','int')->find();
// 或者
Db::table('user')->where(['status'=>1])->type(['status'=>'int'])->find();
// 當前Sql: SELECT * from 表前綴user where status= 1 limit 1 查詢的時候status是查詢的字符串
// in查詢的時候每個參數指定類型
Db::table('user')->where('status','in',[,1,'abc',0,0])->find();
// 當前Sql: SELECT * from 表前綴user where status in('1','abc','0','0') limit 1 查詢的時候status是查詢的字符串
Db::table('user')->where('status','in',[,1,'abc',0])->type('status',['int','str','bool'])->find();
// 當前Sql: SELECT * from 表前綴user where status in('1','abc',false,'0') limit 1 查詢的時候status是查詢的字符串
// 當in指定參數是4個 type指定了3個參數 后續未指定參數繼續使用str表示
// 當in指定參數是4個 type指定了1個參數 所有參數使用同一個類型
````
### **Delete 刪除數據記錄**
`Db::table('user')->where($map)->delete();`
>刪除指定查詢條件記錄
>delete操作必須指定查詢條件 防止整表刪除
### **子查詢**
`Db::childTable(Db::table('dingtalk_attendance')->where('work_id','>’,1)->field('work_id')->getSql())->where('work_id',1)->count()`
得到SQL:select count(*) as t from (select work_id from xx_dingtalk_attendance where work_id > 1)
### **事務操作**
#### 開始事務
`Db::table('user')->startTrans();`
#### 事務回滾
`Db::table('user')->rollback();`
#### 事務提交
`Db::table('user')->commit();`
### **獲取Sql語句**
```
Db::table('user')->where('id',1)->find();
Db::getLastSql();
```
`Db::getLastSql();` 會返回上次執行的Sql語句