// +---------------------------------------------------------------------- namespace Think\Model; class Lite { // 当前数据库操作对象 protected $db = null; // 数据库名称 protected $dbName = ''; //数据库配置 protected $connection = ''; // 数据表前缀 protected $tablePrefix = ''; // 数据表名(不包含表前缀) protected $tableName = ''; // 实际数据表名(包含表前缀) protected $trueTableName = ''; // 最近错误信息 protected $error = ''; // 配置参数 protected $config = []; /** * 架构函数 * 取得DB类的实例对象 字段检查 * @access public * @param string $name 模型名称 * @param string $tablePrefix 表前缀 * @param mixed $connection 数据库连接信息 */ public function __construct($name='',$tablePrefix='',$connection='') { // 模型初始化 $this->_initialize(); // 读取配置参数 $this->config = Config::get(); // 获取模型名称 if(!empty($name)) { if(strpos($name,'.')) { // 支持 数据库名.模型名的 定义 list($this->dbName,$this->name) = explode('.',$name); }else{ $this->name = $name; } }elseif(empty($this->name)){ $this->name = $this->getModelName(); } // 设置表前缀 if(is_null($tablePrefix)) {// 前缀为Null表示没有前缀 $this->tablePrefix = ''; }elseif('' != $tablePrefix) { $this->tablePrefix = $tablePrefix; }else{ $this->tablePrefix = $this->tablePrefix?$this->tablePrefix:$this->config['db_prefix']; } // 数据库初始化操作 // 获取数据库操作对象 // 当前模型有独立的数据库连接信息 $this->db(0,empty($this->connection)?$connection:$this->connection); } /** * 得到当前的数据对象名称 * @access public * @return string */ public function getModelName() { if(empty($this->name)) $this->name = substr(get_class($this),0,-5); return $this->name; } /** * 得到完整的数据表名 * @access public * @return string */ public function getTableName() { if(empty($this->trueTableName)) { $tableName = !empty($this->tablePrefix) ? $this->tablePrefix : ''; if(!empty($this->tableName)) { $tableName .= $this->tableName; }else{ $tableName .= parse_name($this->name); } $this->trueTableName = strtolower($tableName); } return (!empty($this->dbName)?$this->dbName.'.':'').$this->trueTableName; } /** * SQL查询 * @access public * @param string $sql SQL指令 * @param array $binding 参数绑定 * @return mixed */ public function query($sql,$binding=[]) { $sql = $this->parseSql($sql); return $this->db->query($sql,$binding); } /** * 执行SQL语句 * @access public * @param string $sql SQL指令 * @param array $binding 参数绑定 * @return false | integer */ public function execute($sql,$binding=[]) { $sql = $this->parseSql($sql); return $this->db->execute($sql,$binding); } /** * 解析SQL语句 * @access public * @param string $sql SQL指令 * @return string */ protected function parseSql($sql) { // 分析表达式 $sql = strtr($sql,array('__TABLE__'=>$this->getTableName(),'__PREFIX__'=>$this->config['DB_PREFIX'])); $this->db->setModel($this->name); return $sql; } /** * 切换当前的数据库连接 * @access public * @param integer $linkNum 连接序号 * @param mixed $config 数据库连接信息 * @return Model */ public function db($linkNum='',$config=''){ if(''===$linkNum && $this->db) { return $this->db; } static $_linkNum = []; static $_db = []; if(!isset($_db[$linkNum]) || (isset($_db[$linkNum]) && $config && $_linkNum[$linkNum]!=$config) ) { // 创建一个新的实例 if(!empty($config) && is_string($config) && false === strpos($config,'/')) { // 支持读取配置参数 $config = Config::get($config); } $_db[$linkNum] = Db::Lite($config); }elseif(NULL === $config){ $_db[$linkNum]->close(); // 关闭数据库连接 unset($_db[$linkNum]); return ; } // 记录连接信息 $_linkNum[$linkNum] = $config; // 切换数据库连接 $this->db = $_db[$linkNum]; return $this; } /** * 启动事务 * @access public * @return void */ public function startTrans() { $this->commit(); $this->db->startTrans(); return ; } /** * 提交事务 * @access public * @return boolean */ public function commit() { return $this->db->commit(); } /** * 事务回滚 * @access public * @return boolean */ public function rollback() { return $this->db->rollback(); } /** * 返回模型的错误信息 * @access public * @return string */ public function getError(){ return $this->error; } /** * 返回数据库的错误信息 * @access public * @return string */ public function getDbError() { return $this->db->getError(); } /** * 返回最后插入的ID * @access public * @return string */ public function getLastInsID() { return $this->db->getLastInsID(); } /** * 返回最后执行的sql语句 * @access public * @return string */ public function getLastSql() { return $this->db->getLastSql($this->name); } }