当前位置 : 主页 > 网络编程 > PHP >

DB_model自己实现的数据库model

来源:互联网 收集:自由互联 发布时间:2021-06-28
* 1.实现了数据库增删改查 * 2.实现model关联查询 * 3.分页显示,join 多张表链接的复杂查询,自动区分字段(重点) * 4.自动过滤数据库中不存在的字段 * 5.自动维护create_time,update_time的值
* 1.实现了数据库增删改查 * 2.实现model关联查询 * 3.分页显示,join 多张表链接的复杂查询,自动区分字段(重点) * 4.自动过滤数据库中不存在的字段 * 5.自动维护create_time,update_time的值 * 6.表别名设置 * 7.多表关联,魔法给字段添加表别名 * 8.条件组合查询,自动匹配
/**
 * 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表字段
        }
    }

}
网友评论