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 相关文章推荐
Linux下ZendOptimizer的安装与配置方法
Apr 12 PHP
用PHP连接MySQL代码的参数说明
Jun 07 PHP
thinkphp中ajax与php响应过程详解
Dec 08 PHP
ecshop实现smtp发送邮件
Feb 03 PHP
php显示指定目录下子目录的方法
Mar 20 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
PHP浮点数的一个常见问题
Mar 10 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
PHP与SQL语句常用大全
Dec 10 PHP
php图形jpgraph操作实例分析
Feb 22 PHP
PHP图片水印类的封装
Jul 06 PHP
PHP创建自己的Composer包方法
Apr 09 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
php实现简单爬虫的开发
2016/03/28 PHP
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
使用Function.apply()的参数数组化来提高 JavaScript程序性能的技巧
2015/12/23 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
基于JavaScript实现带缩略图的轮播效果
2017/01/12 Javascript
JS实现的点击表头排序功能示例
2017/03/27 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
Angular之toDoList的实现代码示例
2017/12/02 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
深入了解JavaScript 的 WebAssembly
2019/06/15 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
python解析xml文件实例分析
2015/05/27 Python
python实现图片文件批量重命名
2020/03/23 Python
Python 对输入的数字进行排序的方法
2018/06/23 Python
Python中函数参数调用方式分析
2018/08/09 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
小女主人连衣裙:Little Mistress
2017/07/10 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
华纳兄弟工作室的官方授权商店:WB Shop
2018/11/30 全球购物
英语演讲稿范文
2014/01/03 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
小学生爱国演讲稿
2014/04/25 职场文书
校本课程教学计划
2015/01/19 职场文书
工作服管理制度范本
2015/08/06 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle