ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] **** ## 1 简介 ### 1-1 数据库驱动层次 TP5的数据库驱动实现了重构 从应用到底层从上到下分为以下几部分 >[info]1 数据库中间层(Db.php):数据库操作接口 >[info]2 数据库连接(Connection.php):数据库连接操作与查询入口 >[info]3 数据库查询(Query.php):数据库查询操作 >[info]4 数据库查询语句构造(Builder.php):合成数据库查询语句 另外还是要Model封装了数据库的ORM操作 有关模型ORM的分析见 新模型Model功能 ### 1-2 层次关系 >[info]1 Db.php:数据库操作接口 >[info]2 Connection.php:数据库连接接口 >[info]3 Query.php:数据库语句执行接口 >[info]4 Builder.php:数据库语句生成接口 整个层次实现为通过(Builder.php)生成语句,然后在(Connection.php)连接的数据库实例上,通过(Query.php)执行生成的语句 而Db.php作为数据库的操作接口 ## 2 数据库中间层(Db.php) ### 2-1 成员变量 ~~~ ;所有数据库连接实例,当前数据库连接实例 private static $instances = []; private static $instance = null; ;数据库查询次数统计,数据库执行次数统计 public static $queryTimes = 0; public static $executeTimes = 0; ~~~ ### 2-2 public 成员方法 #### 1 connect() 数据库初始化 ~~~ public static function connect($config = []) ~~~ > $config:数据库连接配置 > 生成数据库连接实例存储到$instances与$instance中,并返回self::$instance ~~~ ;使用Db::connect()初始化数据库连接 $db = Db::connect([ 'type' => 'mysql', 'dsn' => '', 'hostname' => '127.0.0.1', 'database' => 'thinkphp', 'username' => 'root', 'password' => '', 'hostport' => '', 'params' => [], 'charset' => 'utf8', 'prefix' => 'think_', ]); ~~~ ~~~ ;使用/config/database.php配置中的连接参数 return [ 'type' => 'mysql', 'dsn' => '', 'hostname' => '127.0.0.1', 'database' => 'thinkphp', 'username' => 'root', 'password' => '', 'hostport' => '', 'params' => [], 'charset' => 'utf8', 'prefix' => 'think_', 'debug' => false, 'deploy' => 0, 'rw_separate' => false, 'master_num' => 1, 'slave_no' => '', ]; $db = Db::connect(); ~~~ ~~~ ;使用字符串配置 $db = Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8'); ~~~ ~~~ ;/config/database.php中多个数据库配置 //数据库配置1 'db_config1' => [ 'type' => 'mysql', 'hostname' => '127.0.0.1', 'database' => 'thinkphp', 'username' => 'root', 'password' => '', 'charset' => 'utf8', 'prefix' => 'think_', ], //数据库配置2 'db_config2' => 'mysql://root:1234@localhost:3306/thinkphp#utf8'; $db1 = Db::connect('db_config1'); $db2 = Db::connect('db_config2'); ~~~ ~~~ ;在Model中配置数据库连接 namespace app\index\model; use think\Model; class User extends Model { protected static $connection = [ 'type' => 'mysql', 'dsn' => '', 'hostname' => '127.0.0.1', 'database' => 'thinkphp', 'username' => 'root', 'password' => '', 'hostport' => '', 'params' => [], 'charset' => 'utf8', 'prefix' => 'think_', 'debug' => false, 'deploy' => 0, 'rw_separate' => false, 'master_num' => 1, 'slave_no' => '', ]; } ~~~ ~~~ ;模型中字符串数据库连接配置 namespace app\index\model; use think\Model; class User extends Model { //或者使用字符串定义 protected static $connection = 'mysql://root:1234@127.0.0.1:3306/thinkphp#utf8'; } ~~~ #### 2 __callStatic() 数据库静态方法调用拦截 ~~~ public static function __callStatic($method, $params) ~~~ >$method:调用的方法名 >$paramse:调用方法的参数 >内部调用self::$instance对应的方法。 ~~~ ;数据库查询语句 $data = Db::query('select * from think_user where id=?',[8]); ;数据库语句执行 $result = Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']); ;使用助手函数 $data = db($config)->query('select * from think_user where id=:id',['id'=>8]); ~~~ ### 2-3 private 方法 #### 1 parseConfig() 数据库配置解析 ~~~ private static function parseConfig($config) ~~~ > $config:数据库连接参数,如果为空则获取配置文件database.php中数据库连接配置参数 #### 2 parseDsn() 数据库DSN配置解析 ~~~ private static function parseDsn($dsnStr) ~~~ > $dsnStr :dsn字符串 > 解析字符串为数据库配置参数 ## 3 数据库连接(Connection.php) ### 3-1 成员变量 ~~~ ;PDO操作实例 protected $PDOStatement; ;当前操作的数据表名;当前操作的数据对象名;当前SQL指令 protected $table = ''; protected $name = ''; protected $queryStr = ''; ;操作结果最后插入ID;返回或者影响记录数 protected $lastInsID; protected $numRows = 0; ;事务的数据库连接;事务指令数;事务标识 protected $transPDO; protected $transTimes = 0; protected $transLabel = ''; ;错误信息;数据库连接ID数组 ;当前连接ID protected $error = ''; protected $links = []; protected $linkID; ;查询结果类型 ;字段属性大小写;监听回调 protected $fetchType = PDO::FETCH_ASSOC; protected $attrCase = PDO::CASE_LOWER; protected static $event = []; ;数据库连接参数配置 protected $config = [ 'type' => '', 'hostname' => '', 'database' => '', 'username' => '', 'password' => '', 'hostport' => '', 'dsn' => '', 'params' => [], 'charset' => 'utf8', 'prefix' => '', 'debug' => false, 'deploy' => 0, 'rw_separate' => false, 'master_num' => 1, 'slave_no' => '', 'fields_strict' => true, ]; ;PDO连接参数 protected $params = [ PDO::ATTR_CASE => PDO::CASE_LOWER, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL, PDO::ATTR_STRINGIFY_FETCHES => false, PDO::ATTR_EMULATE_PREPARES => false, ]; ~~~ ### 3-2 public成员方法 #### 1 __construct() 连接构造函数 ~~~ public function __construct(array $config = []) ~~~ > $config:连接配置信息 > 获取配置参数创建查询对象。 #### 2 __call() 连接对象方法回调拦截 ~~~ public function __call($method, $args) ~~~ > $method: 调用的方法名 > $args: 调用方法的参数 > 内部调用查询对象的对应方法 #### 3 getConfig() 获取数据库配置 ~~~ public function getConfig($config) ~~~ > $config: 配置名称 > 返回数据库配置中对应名称的值 #### 4 setConfig() 修改数据库配置 ~~~ public function setConfig($config, $value) ~~~ > $config:配置名称,$value:配置名称值 #### 5 connect() 数据库连接 ~~~ public function connect(array $config = [], $linkNum = 0, $autoConnection = false) ~~~ > $config: 数据库连接配置 > $linkNum 连接序号 > $autoConnection 自动连接控制(分布式中) #### 6 getDriverName() 获取数据库驱动类型 ~~~ public function getDriverName() ~~~ > 返回数据库驱动类型或者数据库类型 #### 7 free() 释放查询结果 ~~~ public function free() ~~~ > 置空PDOStatement #### 8 getPdo() 获取PDO对象 ~~~ public function getPdo() ~~~ #### 9 query() 执行数据库查询(重点) ~~~ public function query($sql, $bind = [], $fetch = false, $master = false, $returnPdo = false) ~~~ > $sql: 数据库语句 > $bind: 参数绑定  > $fetch: 是否只返回合并的sql语句 > $master: 是否在主服务器操作 > $returnPdo: 是否返回PDOStatement对象 #### 10 execute() 执行数据库操作语句(重点) ~~~ public function execute($sql, $bind = [], $fetch = false, $getLastInsID = false) ~~~ > $sql: 数据库语句 > $bind: 参数绑定 > $fetch: 是否只返回合并的sql语句 > $getLastInsID:是否返回自增ID #### 11 transaction() 执行数据库事务 ~~~ public function transaction($callback) ~~~ > $callback 数据库事务回调 #### 12 startTrans()  数据库事务启动 ~~~ public function startTrans($label = '') ~~~ > $label:事务标识 #### 13 commit() 数据库事务手动提交 ~~~ public function commit($label = '') ~~~ > $label:事务标识 #### 14 rollback() 数据库事务回滚 ~~~ public function rollback() ~~~ #### 15 batchQuery() 数据库语句数组执行 ~~~ public function batchQuery($sql = []) ~~~ > $sql:数据库语句数组 #### 16 parseSqlTable() 数据库表前缀替换 ~~~ public function parseSqlTable($sql) ~~~ > $sql:数据库语句 #### 17 getQueryTimes() 获取查询次数 ~~~ public function getQueryTimes($execute = false) ~~~ > $execute:是否返回执行次数 #### 18 getExecuteTimes() 获取执行次数 ~~~ public function getExecuteTimes() ~~~ #### 19 close() 关闭数据库 ~~~ public function close() ~~~ #### 20 getLastSql() 获取最后一次查询的sql语句 ~~~ public function getLastSql() ~~~ #### 21 getLastInsID() 获取最后插入的ID ~~~ public function getLastInsID() ~~~ #### 22 getError() 获取最后的错误信息 ~~~ public function getError() ~~~ #### 23 quote() sql指令安全过滤 ~~~ public function quote($str) ~~~ > $str:待过滤sql语句 #### 24 listen() 注册sql监听回调 ~~~ public function listen($callback) ~~~ > $callback: 监听回调数组键名为事件名,键值为回调 #### 25 __destruct() 数据库析构方法 ~~~ public function __destruct() ~~~ > 释放数据库资源 ### 3-3 abstract成员方法 #### 1 parseDsn() 解析DSN配置 ~~~ abstract protected function parseDsn($config); ~~~ > 在具体类型的数据库连接中实现 ### 3-4 protected成员方法 #### 1 fieldCase() 数据库表字段大小写转换 ~~~ protected function fieldCase($info) ~~~ > $info 字段信息 > 根据PDO参数转换对应字段大小写 #### 2 getBindSql() 组织SQL语句 ~~~ protected function getBindSql($sql, array $bind = []) ~~~ > $sql: sql语句 > $bind: 绑定参数列表 > 返回组织的SQL语句 #### 3 bindValue() 参数绑定处理 ~~~ protected function bindValue(array $bind = []) ~~~ > $bind:绑定参数列表 #### 4 getResult() 获取数据集 ~~~ protected function getResult() ~~~ > 调用PDO的fetchAll()获取操作结果 #### 5 debug() 数据库调试操作 ~~~ protected function debug($start) ~~~ > $start:true,数据库调试开始;false,数据库调试结束 #### 6 trigger() 触发SQL事件 ~~~ protected function trigger($sql, $runtime, $explain = []) ~~~ > $sql语句 > $runtime sql运行时间 > $explain sql分析 #### 7 initConnect() 数据库连接初始化 ~~~ protected function initConnect($master = true) ~~~ > $master:是否主服务器连接 #### 8 multiConnect() 主数据库连接 ~~~ protected function multiConnect($master = false) ~~~ > $master:是否主服务器连接 ### 3-5 数据库连接驱动(db\connector\) 数据库连接实现为下不同类型数据库的连接 目前包含Mysql,Oracle,Pgsql,Sqlite,Sqlsrv等数据库 各种数据库连接主要包含的方法如下 ~~~ ;解析DSN字符串 protected function parseDsn($config) ;获取数据库表字段信息 public function getFields($tableName) ;获取数据库表单信息 public function getTables($dbName = '') ;sql性能分析 protected function getExplain($sql) ~~~ ## 4 数据库查询(Query.php) ### 4-1 成员变量 ~~~ ;连接对象,驱动类型 protected $connection; protected $driver; ;查询参数,绑定参数 protected $options = []; protected $bind = []; ~~~ ### 4-2 public成员方法 #### 1 __construct() 构造查询对象 ~~~ public function __construct($connection = '') ~~~ > $connection:连接对象 > 初始化连接对象$this->connection和连接类型$this->driver #### 2 __call() 对象方法调用拦截 ~~~ public function __call($method, $args) ~~~ > $method:调用的方法名 > $args:调用方法的参数 > 内部调用where()->find(),或者where()->value() #### 3 value() 获取某个字段的值 ~~~ public function value($field) ~~~ > $field:字段名 > #### 4 column() 获取某个列的数组 ~~~ public function column($field, $key = '') ~~~ > $filed:字段名或字段数组名 > $key:索引 #### 5 count() COUNT查询 ~~~ public function count($field = '*') ~~~ > $filed:统计的列字段名称 #### 6 sum() SUM查询 ~~~ public function sum($field = '*') ~~~ > $field:求和的列字段名称 #### 7 min() MIN查询 ~~~ public function min($field = '*') ~~~ > $filed:求最小值的列字段名称 #### 8 max() MAX查询 ~~~ public function max($field = '*') ~~~ > $field:求最大值的列字段名称 #### 9 avg() AVG查询 ~~~ public function avg($field = '*') ~~~ > $field:求平均值的列字段名称 #### 10 setField() 修改字段的值 ~~~ public function setField($field, $value = '') ~~~ > $field:修改的字段列名称 > $value:字段值 #### 11 setInc() 字段自增 ~~~ public function setInc($field, $step = 1, $lazyTime = 0) ~~~ > $field:自增的字段列名称 > $step:自增的值 > $lazyTime:延迟的值 #### 12 setDec() 字段自减 ~~~ public function setDec($field, $step = 1, $lazyTime = 0) ~~~ > $field:自减的字段列名称 > $step:自减的值 > $lazyTime:延迟时间 #### 13 joins() join查询 ~~~ public function join($join, $condition = null, $type = 'INNER') ~~~ > $join:关联的表信息 > $condition:查询条件 > $type:joins类型 #### 14 union() union查询 ~~~ public function union($union, $all = false) ~~~ > $union:union语句 > $all: #### 15 field() 指定查询字段 ~~~ public function field($field, $except = false, $tableName = '', $prefix = '', $alias = '') ~~~ > $filed:字段名 > $except: 字段排除控制 > $tableName: 数据表名 > $prefix: 字段前缀 > $alias: 别名前缀 #### 16 where() 指定查询条件 ~~~ public function where($field, $op = null, $condition = null) ~~~ > $field:字段名 > $op:查询表达式 > $condition:查询条件 #### 17 whereOr() Or查询条件 ~~~ public function whereOr($field, $op = null, $condition = null) ~~~ > $field:字段名 > $op:查询表达式 > $condition:查询条件 #### 18 whereExist() whereOrExist() whereNotExist() whereOrNotExist() 查询条件 ~~~ public function whereExist($where) public function whereOrExist($where) public function whereNotExist($where) public function whereOrNotExist($where) ~~~ > $where:条件表达式 #### 19 limit() limit生成 ~~~ public function limit($offset, $length = null) ~~~ > $offset:起始位置 > $length:获取长度 #### 20 page() 分页查询 ~~~ public function page($page, $listRows = null) ~~~ > $page:页数 > $listRows:每页数量 #### 21 table() From语句 ~~~ public function table($table) ~~~ > $table:操作表名称 #### 22 using() USING语句 ~~~ public function using($using) ~~~ #### 23 order() ORDER语句 ~~~ public function order($field, $order = null) ~~~ > $field:排序字段 > $order:排序控制 #### 24 cache() 查询缓存 ~~~ public function cache($key = true, $expire = null) ~~~ > $key:缓存控制 > $expire:缓存时间 #### 25 group() GROUP语句 ~~~ public function group($group) ~~~ #### 26 having() HAVING语句 ~~~ public function having($having) ~~~ #### 27 lock() LOCK语句 ~~~ public function lock($lock = false) ~~~ #### 28 distinct() DISTINCT语句 ~~~ public function distinct($distinct) ~~~ #### 29 alias() 数据表别名 ~~~ public function alias($alias) ~~~ #### 30 force() 强制索引 ~~~ public function force($force) ~~~ #### 31 comment() 注释语句 ~~~ public function comment($comment) ~~~ #### 32 fetchSql() 是否返回SQL语句 ~~~ public function fetchSql($fetch = true) ~~~ #### 33 fetchPdo() 是否返回Pdo ~~~ public function fetchPdo($pdo = true) ~~~ #### 34 master() 是否主服务器 ~~~ public function master() ~~~ #### 35 strict() 是否严格检查字段名 ~~~ public function strict($strict = true) ~~~ #### 36 failException() 是否抛出异常 ~~~ public function failException($fail = true) ~~~ #### 37 model() 指定当前模型 ~~~ public function model($model) ~~~ #### 38 name() 指定当前模型名 ~~~ public function name($name) ~~~ #### 39 getTable() 获取当前的数据表 ~~~ public function getTable() ~~~ #### 40 getTableInfo() 获取数据表信息 ~~~ public function getTableInfo($tableName = '', $fetch = '') ~~~ #### 41 getPk() 获取主键 ~~~ public function getPk($table = '') ~~~ #### 42 bind() 参数绑定处理 ~~~ public function bind($key, $value = false, $type = PDO::PARAM_STR) ~~~ #### 43 isBind() 检查是否绑定参数 ~~~ public function isBind($key) ~~~ #### 44 getOptions() 获取查询参数 ~~~ public function getOptions($name = '') ~~~ #### 45 with() 关联查询JOIN预查询 ~~~ public function with($with) ~~~ #### 46 via() 设置字段的表别名 ~~~ public function via($via = '') ~~~ #### 47 relation() 设置关联查询 ~~~ public function relation($relation) ~~~ #### 48 insert() 添加数据 ~~~ public function insert(array $data, $replace = false, $getLastInsID = false) ~~~ #### 49 insertGetId() 添加数据获取自增ID ~~~ public function insertGetId(array $data, $replace = false) ~~~ #### 50 insertAll() 批量添加数据 ~~~ public function insertAll(array $dataSet) ~~~ #### 51 selectInsert() 添加查询结果到数据库 ~~~ public function selectInsert($fields, $table) ~~~ #### 52 update() 更新数据 ~~~ public function update(array $data) ~~~ #### 53 select() 查询多条数据 ~~~ public function select($data = []) ~~~ #### 54 find() 查询单条数据 ~~~ public function find($data = []) ~~~ #### 55 chunk() 分批数据返回处理 ~~~ public function chunk($count, $callback, $column = null) ~~~ #### 56 getBind() 获取绑定参数并清空 ~~~ public function getBind() ~~~ #### 57 buildSql() 构造子查询 ~~~ public function buildSql($sub = true) ~~~ #### 58 delete() 删除数据 ~~~ public function delete($data = []) ~~~ #### 59 parseExpress() 检查查询参数 ~~~ public function parseExpress() ~~~ ### 4-3 protected成员方法 #### 1 builder() 创建查询语句构建对象 ~~~ protected function builder() ~~~ > 根据$this->driver数据库类型创建对应构建对象 > 设置当前查询对象 setQuery() #### 2 lazyWrite() 延迟更新时间 ~~~ protected function lazyWrite($guid, $step, $lazyTime) ~~~ > $guid:写入标识 > $step:写入步进值 > $lazyTime:写入的延迟时间 #### 3 parseWhereExp() 合成查询下条件 ~~~ protected function parseWhereExp($operator, $field, $op, $condition, $param = []) ~~~ > $operator:条件缓存键名 > $field: 查询字段 > $op:查询表达式 > $condition:查询条件 > $param:查询参数 #### 4 parsePkWhere() 解析主键为查询条件 ~~~ protected function parsePkWhere($data, &$options) ~~~ ## 5 查询语句构造(Builder.php) ### 5-1 成员变量 ~~~ ;数据库连接实例,查询实例 protected $connection; protected $query; ;查询参数 protected $options = []; ;运算符转换数组 protected $exp = []; ;语句构造模板 protected $selectSql; protected $insertSql; protected $insertAllSql; protected $updateSql; protected $deleteSql; ~~~ ### 5-2 public 成员方法 #### 1 __construct() 构造函数 ~~~ public function __construct($connection) ~~~ > 初始化数据库连接对象 #### 2 setQuery() 设置Query对象 ~~~ public function setQuery($query) ~~~ #### 3 buildWhere() 生成where语句 ~~~ public function buildWhere($where, $table) ~~~ #### 4 select() 生成select语句 ~~~ public function select($options = []) ~~~ #### 5 insert() 生成insert语句 ~~~ public function insert(array $data, $options = [], $replace = false) ~~~ #### 6 insertAll() 生成InsertAll语句 ~~~ public function insertAll($dataSet, $options) ~~~ #### 7 selectInsert() 生成selectinsert语句 ~~~ public function selectInsert($fields, $table, $options) ~~~ #### 8 update() 生成update语句 ~~~ public function update($data, $options) ~~~ #### 9 delete() 生成delete语句 ~~~ public function delete($options) ~~~ ### 5-3 protected 成员方法 ~~~~ ;Table,Data,Key,Value,Field,Table,Where等解析 protected function parseSqlTable($sql) protected function parseData($data, $options) protected function parseKey($key) protected function parseValue($value) protected function parseField($fields) protected function parseTable($tables) protected function parseWhere($where, $table) ;where子单元解析,闭包子查询解析,Limit解析,Join解析,Order解析,Group解析,Having解析,Comment解析,Distinct解析,Union解析,index解析,Lock解析 protected function parseWhereItem($key, $val, $rule = '') protected function parseClosure($call, $show = true) protected function parseLimit($limit) protected function parseJoin($join) protected function parseOrder($order) protected function parseGroup($group) protected function parseHaving($having) protected function parseComment($comment) protected function parseDistinct($distinct) protected function parseUnion($union) protected function parseForce($index) protected function parseLock($lock = false) ~~~~ ### 5-4 数据库语句构造驱动(\db\builder\) 在构造驱动目录下实现了针对不同数据库的语句生成驱动 目前包含Mysql,Oracle,Pgsql,Sqlite,Sqlsrv6种 其中的主要方法为Builder.php的方法覆盖或者扩展 ~~~ ;字段和表名处理 protected function parseKey($key) ;随机排序 protected function parseRand() ~~~