CI框架(CodeIgniter)公共模型类定义与用法示例


Posted in PHP onAugust 10, 2017

本文实例讲述了CI框架(CodeIgniter)公共模型类定义与用法。分享给大家供大家参考,具体如下:

我们都知道,操作数据库的方法都写在模型中。但是一般情况下,一张表往往至少对应4个操作,也就是所谓crud。那么如果20张表,所对应的模型方法,就达到了80个,重复的操作显然这已经是一个体力活儿。

那么就对单表操作时,我们进行一下简单的封装。如下是ci框架的示例:

<?php
/**
 * Created by PhpStorm.
 * User: kangjianrong
 * Date: 16-8-26
 * Time: 上午10:29
 */
class My_model extends CI_Model {
  //数据库
  public $errors = array();
  const dataBase = 'qndnew';
  public function __construct()
  {
    // Call the CI_Model constructor
    parent::__construct();
  }
  /**
   * 查询分页数据(使用于简单的单表操作)
   * @param string $model 模型     例如:User_model
   * @param string $table 表名
   * @param string $select_fields 要显示字段
   * @param array $param 查询条件:
   *   compare(比较):
   *     array($key => $val) $key为要操作的字段,$val为要操作的值
   *     array('name !=' => $name, 'id <' => $id, 'date >' => $date);
   *   like(模糊查询)
   *     array('title' => $match, 'page1' => $match, 'page2' => $match)
   *   customStr(自定义字符串):
   *     "name='Joe' AND status='boss' OR status='active'"
   *   in:
   *     array('userName' => array('Frank', 'Todd', 'James'))
   * @param string $page 当前页数(查询全部数据时,设置为空)
   * @param string $limit 查询条数(查询全部数据时,设置为空)
   * @param array $order 排序条件:
   *   array($key => $val)
   *   $key为排序依据的字段,
   *   $val为排序的方式【asc (升序,默认)或 desc(降序), 或 random(随机)】
   * @$isReturnCount boole    是否返回总条数
   * @return array|boolean
   *
   */
  public function pageData($model, $table, $param = array(),$select_fields = '', $page = '1', $limit = '15', $order = array(),$isReturnCount = true){
    if(empty($model) || empty($table)){
      return false;
    }
    $this -> load -> model($model);
    $table = $this->db->dbprefix.$table;
    //处理查询字段
    if(!empty($select_fields)){
      $this->db->select($select_fields)->from($table);
    }elseif(isset($this -> $model -> selectFields)){
      $this->db->select($this -> $model -> selectFields)->from($table);
    }else{
      $this->db->select('*')->from($table);
    }
    //处理查询条件
    if (is_array($param) && count($param) > 0){
      $this -> parseParam($param);
    }
    //统计总数
    if($isReturnCount){
      $rs['count']  = $this->db->count_all_results('',false);//不重置查询构造器
      array_push($this -> errors,$this->db->last_query());
    }
    //分页数据处理
    if(isset($page) && isset($param['limit'])){
      //分页边界值 设置
      $offset = $param['page'] <= 1 ? 0 : ($param['page']-1) * $param['limit'];
      $this->db->limit($param['limit'], $offset);
    }
    //排序规则的组合
    if (!empty($order) && is_array($order))
    {
      foreach ($order as $key => $val)
      {
        $this->db->order_by($key, $val);
      }
    }else{
      //默认按照此表的主键倒序
      $primary = $this->getPrimary();
      if(!empty($primary))
      {
        $this->db->order_by($primary, 'DESC');
      }
    }
    $query = $this->db->get();
    array_push($this -> errors,$this->db->last_query());
    $rs['list'] = $query->result_array();
    return $rs;
  }
  /**
   * 解析参数
   */
  private function parseParam($param){
    if(isset($param['compare'])){
      foreach ($param['compare'] as $key => $val){
        if (!empty($val)) $this->db->where($key, $val);
      }
    }
    if(isset($param['like'])){
      foreach ($param['like'] as $key => $val){
        if (!empty($val)) $this->db->like($key, $val);
      }
    }
    if(isset($param['in'])){
      foreach ($param['in'] as $key => $val){
        if (!empty($val)) $this->db->where_in($key, $val);
      }
    }
    if(isset($param['customStr'])){
      if (!empty($val)) $this->db->where($param['customStr']);
    }
  }
  /**
   * 新增信息
   * @param string $table 表名称
   * @param array $param 数据变量
   * @return INT ID
   */
  public function add($table = '', $param = array())
  {
    if(empty($table) || !is_array($param) || empty ($param)){
      return FALSE;
    }
    //写入数据表
    $this->db->insert($table, $param);
      array_push($this -> errors,$this->db->last_query());
    //返回记录ID
    return $this->db->insert_id();
  }
  /**
   * 更新分类信息
   * @param string  $table   表名称
   * @param string  $primary  表主键
   * @param int    $id     分类ID
   * @param array   $param   更新的数据
   * @return type
   */
  public function update($table = '', $primary = '', $id = 0, $param = array())
  {
    if(empty($table) || empty($primary) || empty($param) || empty($id))
    {
      return FALSE;
    }
    $id = (int)$id;
    $this->db->where($primary, $id)
         ->limit(1)
         ->update($table, $param);
    array_push($this -> errors,$this->db->last_query());
    return $this->db->affected_rows();
  }
  /**
   * 删除指定ID记录
   * @param string  $table   表名称
   * @param string  $primary  表主键
   * @param array   $id     分类ID
   * @return int
   */
  public function delete($table = '', $primary = '', $id = array()){
    if(empty($table) || empty($primary) || empty($id)){
      return FALSE;
    }
    $this->db->where_in($primary, $id)
        ->delete($table);
    array_push($this -> errors,$this->db->last_query());
    return $this->db->affected_rows();
  }
  /**
   * 获取表的主键
   * @param string  $database  数据库名称
   * @param strting  $table   表名称
   */
  public function getPrimary($table = '', $database = self::dataBase)
  {
    if(empty($database) || empty($table))
    {
      return FALSE;
    }
    $sql = "SELECT k.column_name
        FROM information_schema.table_constraints t
        JOIN information_schema.key_column_usage k
        USING (constraint_name,table_schema,table_name)
        WHERE t.constraint_type='PRIMARY KEY'
         AND t.table_schema='qndnew'
         AND t.table_name='qnd_user'";
    $query = $this->db->query($sql)->result_array();
    return isset($query[0]['column_name']) ? $query[0]['column_name'] : false;
  }
  /**
   * debug sql语句
   */
  public function debugSql(){
    if(count($this->errors) > 0){
      foreach($this->errors as $val){
        echo $val.'<br>';
      }
    }
  }
}

具体的业务逻辑模型如下:

class User_model extends My_model {
  const USER = 'qnd_user';
  public $selectFields = array(
    'id',
    'guid',
    'phone',
    'userName',
    'password',
    'headPortraits',
    'nickName',
    'createTime',
  );
  const SMS_ROLE = 'qnd_role';
  public function __construct()
  {
  }
}

控制器中测试如下:

public function modelTest(){
    $this -> load -> model('User_model'); // ?入 model
    $whereArr = array(
            'compare'=>array(
              'userName' => 'Frank',
            ),
          );
    $rs = $this -> User_model -> pageData('User_model','user',$whereArr);
    print_r($rs);
    $this -> User_model -> debugSql();
  }

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php+mysql 实现身份验证代码
Mar 24 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
用PHP来计算某个目录大小的方法
Apr 01 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
html静态页面调用php文件的方法
Nov 13 PHP
yii数据库的查询方法
Dec 28 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
ThinkPHP实现更新数据实例详解(demo)
Jun 29 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 PHP
php 可变函数使用小结
Jun 12 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 #PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 #PHP
php+jQuery实现的三级导航栏下拉菜单显示效果
Aug 10 #PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 #PHP
Laravel实现定时任务的示例代码
Aug 10 #PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 #PHP
PHP实现将标点符号正则替换为空格的方法
Aug 09 #PHP
You might like
PHP页面实现定时跳转的方法
2014/10/31 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
Jquery显示、隐藏元素以及添加删除样式
2013/08/09 Javascript
9行javascript代码获取QQ群成员具体实现
2013/10/16 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
2016/10/05 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
jQuery实现ajax无刷新分页页码控件
2017/02/28 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
Ubuntu下安装PyV8
2016/03/13 Python
django之常用命令详解
2016/06/30 Python
python利用正则表达式提取字符串
2016/12/08 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
Python numpy 常用函数总结
2017/12/07 Python
Python语言描述KNN算法与Kd树
2017/12/13 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
Python实现字符型图片验证码识别完整过程详解
2019/05/10 Python
python滑块验证码的破解实现
2019/11/10 Python
如何写毕业求职自荐信
2013/11/06 职场文书
竞选班长演讲稿
2013/12/30 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
公路局群众路线教育实践活动第一阶段工作汇报
2014/10/25 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
2015年乡镇妇联工作总结
2015/05/19 职场文书
公司考勤管理制度
2015/08/04 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
Redis读写分离搭建的完整步骤
2021/09/14 Redis