* 1.实现了数据库增删改查 * 2.实现model关联查询 * 3.分页显示,join 多张表链接的复杂查询,自动区分字段(重点) * 4.自动过滤数据库中不存在的字段 * 5.自动维护create_time,update_time的值
/** * Class DB_Model * 1.实现了数据库增删改查 * 2.实现model关联查询 * 3.分页显示,join 多张表链接的复杂查询,自动区分字段(重点) * 4.自动过滤数据库中不存在的字段 * 5.自动维护create_time,update_time的值 * 6.表别名设置 * 7.多表关联,魔法给字段添加表别名 * 8.条件组合查询,自动匹配 */ class DB_Model extends MY_Model { protected $db = null; protected $table_name = null; protected $alias = '';// 数据表别名 protected $join = []; public function __construct() { parent::__construct(); $this->db = $this->init_db(); if(!$this->table_name){ $this->table_name = $this->db->dbprefix(str_ireplace('_model','',strtolower(get_class($this)))); } if (!$this->db->table_exists($this->table_name)){ show_error($this->table_name." 数据表存在,请检查你的Model命名!",200,"错误提示"); } } // 获取一条数据 public function one($where=null,$fields=null) { if($fields){ $this->db->select($fields); } if($where){ $this->db->where($where); } $query = $this->db->get($this->table_name); $row = $query->row_array(); return $row; } // 获取多条数据 public function all($where=null,$fields=null,$order_by=null,$limit=null) { if($fields){ $this->db->select($fields); } if($where){ $this->db->where($where); } if($order_by){ $this->db->order_by($order_by); } if($limit){ $this->db->limit($limit); } $query = $this->db->get($this->table_name); $row = $query->result_array(); return $row; } // 分页获取数据 public function page($where=null,$fields=null,$order_by=null){ if(!$fields){ $fields = $this->alias?$this->alias.'.* ':'* '; } $this->db->select('SQL_CALC_FOUND_ROWS '.$fields,false); if($this->alias){ $odr = $this->alias; $this->db->from($this->table_name.' as '.$this->alias); }else{ $odr = $this->table_name; $this->db->from($this->table_name); } if($this->join&&is_array($this->join)){ $this->join(); } if($where){ foreach ($where as $k=>$v) if($v=="")unset($where[$k]); if($where)$this->db->where($where); } if($order_by){ $this->db->order_by($order_by); }else{ $this->db->order_by($odr.'.id desc');// 没有则按id排序 } // 分页 $page = $this->input->get('page'); if(!$page)$page = 1; $page_size = $this->input->get('page_size'); if(!$page_size)$page_size = $this->config->item('page_size'); if(!$page_size)show_error('请在配置文件中配置分页参数,page_size'); $this->db->limit($page_size,($page-1)*$page_size); $list = $this->db->get()->result_array(); $nums = $this->db->count_all_results($this->table_name,false); $this->load->library('page'); $page_htm = $this->page->setpage($page,$nums,$page_size); $info['current_page'] = $page; $info['page_size'] = $page_size; $info['nums'] = $nums; $info['page_htm'] = $page_htm; $info['list'] = $list; return $info; } // 添加数据 public function add($params) { if(!$params)return false; if(!is_array($params))return false; $params['create_time'] = time(); $params['update_time'] = time(); $fields = $this->db->list_fields($this->table_name); foreach ($params as $k=>$v){ $m = false; foreach ($fields as $field) { if($k==$field){ $m = true; break; } } if(!$m)unset($params[$k]); } $res = $this->db->insert($this->table_name,$params); if($res){ $id = $this->db->insert_id(); $query = $this->db->query('SELECT * FROM '.$this->table_name.' WHERE id ='.$id); $row = $query->row_array(); return $row; } return $res; } // 修改数据 public function edit($where,$params) { if(!$params)return false; if(!is_array($params))return false; $params['update_time'] = time(); $fields = $this->db->list_fields($this->table_name); foreach ($params as $k=>$v){ $m = false; foreach ($fields as $field) { if($k==$field){ $m = true; break; } } if(!$m)unset($params[$k]); } $this->db->set($params); $this->db->where($where); $this->db->update($this->table_name); $line = $this->db->affected_rows(); if($line){ $query = $this->db->get_where($this->table_name,$where); if($line===1){ $row = $query->row_array(); }else{ $row = $query->result_array(); } return $row; }else{ return false; } } // 删除数据 public function del($where) { if(!$where)return false; $this->db->delete($this->table_name, $where); return $this->db->affected_rows(); } /** * 获取配置数组字段的值 * @param $arr * @param $k * @return mixed */ private function get_val($arr,$k){ if(!is_array($arr))show_error('未定义'.$k); if(!isset($arr[$k]))show_error('未定义'.$k); return $arr[$k]; } /** * 加入第三方表 */ private function join(){ foreach ($this->join as $k =>$v){ $this->load->model($k); $a = $this->get_val($v,'alias');// 别名 $this->db->join($this->$k->table_name.' '.$a , $this->get_val($v,'cond')); // 处理字段(自动加上前缀) $f = $this->get_val($v,'fields'); if($f){ if(!$a)$a = $this->$k->table_name; if(is_array($f)){ foreach ($f as $k=>$v){ if(!stripos($f[$k],'.'))$f[$k] = $a.'.'.$f[$k]; } }else{ $arr = explode(",",$f); $f = ''; foreach ($arr as $k =>$v){ if(!stripos($arr[$k],'.'))$arr[$k] = $a.'.'.$arr[$k]; if($k==0){ $f.= $arr[$k]; }else{ $f.= ','.$arr[$k]; } } } }else{ $f = $a?$a.'.* ':'* '; } $this->db->select($f,false);// 追加join表字段 } } }