* @version : HUOUNION 8.5 */ namespace huomp\model\common; use huolib\constant\CacheConst; use huolib\constant\CommonConst; use think\Cache; use think\db\exception\BindParamException; use think\Exception; use think\exception\PDOException; use think\Model; class NewCommonModel extends Model { protected $pk = 'id'; // 关联模型过滤 protected $relationFilter = []; //protected $table_cache_key_prefix = CacheConst::CACHE_TABLE_FIELD_PREFIX; protected $table_cache_key_prefix = ''; /** * 懒人函数 * * @access public * * @param string $string 字符串 * * @return */ public function strToArr($string) { return is_string($string) ? explode(',', $string) : (array)$string; } /** * 懒人函数 * * @access public * * @param array $arr 数组 * * @return string */ public function arrToStr($arr) { return is_array($arr) ? implode(',', $arr) : (string)$arr; } /** * 计算在哪张表 * * @return \Think\Model */ public function computeTable() { return $this; } /** * @param $data * @param bool $replace * @param bool $get_last_insert_id * * @return bool|int|string */ public function insertLog($data, $replace = false, $get_last_insert_id = true) { if ($_id = $this->computeTable()->insert($data, $replace, $get_last_insert_id)) { return $_id; } else { return false; } } /** * 添加数据 * * @param array $data 需要添加的数据 * * @return false|int 添加失败返回 false 添加成功 返回添加的ID */ public function addData($data) { $this->checkField(); if (empty($data)) { return false; } $_data = $data; $_model = new static(); $_rs = $_model->allowField(true)->isUpdate(false)->save($_data, []); if (false !== $_rs) { return $_model->getLastInsID(); } return false; } /** * 通过ID获取信息 * * @param int $id 主键ID * * @return array|false */ public function getInfoById($id) { $this->checkField(); $_map[$this->pk] = $id; $_info = $this->useGlobalScope(false)->where($_map)->find(); if (false === $_info) { return false; } if (is_object($_info)) { return $_info->toArray(); } else { return $_info; } } /** * 更新数据 * * @param array $data 数据 * @param int|array $id 主集ID * * @return bool */ public function updateData($data, $id) { $this->checkField(); if (is_array($id)) { $_map[$this->pk] = ['in', $id]; } else { $_map[$this->pk] = $id; } $_data = $data; $_model = new static(); $_rs = $_model->allowField(true)->isUpdate(true)->save($_data, $_map); if (false === $_rs) { return false; } else { return true; } } /** * 删除数据 * * @param array|int $ids ID合集 * @param bool $is_complete 是否完成删除 * * @return bool|int */ public function deleteData($ids, $is_complete = false) { $this->checkField(); if (true == is_array($ids)) { $_ids = $ids; } else { $_ids = [$ids]; } $_map[$this->pk] = ['in', $_ids]; if (true == $is_complete) { /* 彻底删除 */ return $this->useGlobalScope(false)->where($_map)->delete(); } else { $_data['is_delete'] = CommonConst::CONST_DELETED; $_data['delete_time'] = time(); foreach ($_ids as $_id) { $_rs = self::updateData($_data, $_id); if (false === $_rs) { return false; } } return true; } } /**当前模型名称(数据库表名,不带前缀) * * @return string */ public function getName() { return $this->name; } /** * 通过条件获取数量 * * @param array $where 条件 * * @return int */ public function getCnt($where = []) { $_map = $where; $_cnt = $this->useGlobalScope(false)->where($_map)->count(); if (empty($_cnt)) { return 0; } return $_cnt; } /** * 通过条件获取汇总 * * @param string $field 字段 * @param array $where 条件 * * @return double */ public function getSum($field, $where = []) { $_map = $where; $_sum = $this->useGlobalScope(false)->where($_map)->sum($field); if (false == $_sum) { return false; } return $_sum; } /** * 判断表中字段是否存在 * * @param string $table 表名 * @param string $column 字段名 * * @return bool */ public function isColumnExist($table, $column) { $_cache_key = $this->table_cache_key_prefix.strtolower($table.$column); $_data = Cache::get($_cache_key); if (1 == $_data) { return true; } $_has_it = false;//是否存在该字段 $_columns = db()->getTableFields($table); if (!empty($_columns)) { foreach ($_columns as $_k => $_v) { if ($_v == $column) { $_has_it = true; break; } } } if (true == $_has_it) { /* 永不过期 */ Cache::set($_cache_key, 1, CommonConst::CONST_MAX_INT); } return $_has_it; } /** * 校验字段 * * @return bool */ protected function checkField() { return true; } /** * 获取表名缓存 * * @param string $table_name * * @return string */ public function getTableCacheKey($table_name) { return $this->table_cache_key_prefix.strtolower($table_name); } /** * @param Exception $exception * * @param object $class 类 * @param string $method 方法 * @param array $arguments 参数 * * @return mixed * @throws Exception */ public function exception($exception, $class, $method = '', $arguments = []) { if (false !== strpos($exception->getMessage(), 'Base table or view not found')) { $this->isTableExist(); $this->genDefaultData(); return call_user_func_array([$class, $method], $arguments); } switch ($exception->getCode()) { case 10501: /* PDO异常处理 */ case 10500: /* Database相关异常处理类 */ case 10502: /* PDO参数绑定异常 */ default: } throw $exception; } /** * 判断表中字段是否存在 * * @param string $table 表名 * * @return bool */ public function isTableExist($table = '') { $_table_name = $table; if (empty($_table_name)) { $_table_name = $this->table; if (!empty($this->partition_field)) { $_table_name = $this->getPartitionTableName( $this->partition_data, $this->partition_field, $this->partition_rule ); } } $_cache_key = $this->getTableCacheKey($_table_name); $_data = Cache::get($_cache_key); if (1 == $_data) { return true; } /* 不存在表 */ $_has_it = false; try { $_table_cnt = db()->query( "SELECT COUNT(*) as table_cnt FROM information_schema.tables WHERE table_schema = '" .$this->connection['database']."' AND table_name = '".$_table_name."';" ); if (!empty($_table_cnt) && !empty($_table_cnt[0]) && !empty($_table_cnt[0]['table_cnt'])) { $_has_it = true; } else { $_rs = $this->checkTable(); if (false !== $_rs) { $_has_it = true; } } } catch (BindParamException $e) { $_has_it = false; } catch (PDOException $e) { $_has_it = false; } if (true == $_has_it) { /* 永不过期 */ Cache::set($_cache_key, 1, 0); } return $_has_it; } /** * 生成数据 */ public function genDefaultData() { return true; } /** * 通过条件获取主键 * * @param array $where 条件 * * @return int */ public function getPkId($where = []) { $_map = $where; try { $_pk_value = $this->useGlobalScope(false)->where($_map)->value($this->pk); if (empty($_pk_value)) { return 0; } return $_pk_value; } catch (Exception $e) { return $this->exception($e, $this, __FUNCTION__, func_get_args()); } } }