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中使用Oracle数据库(6)
Oct 09 PHP
PHP 反射机制实现动态代理的代码
Oct 22 PHP
探讨PHP中OO之静态关键字以及类常量的详解
Jun 07 PHP
定义php常量的详解
Jun 09 PHP
php数组去重实例及分析
Nov 26 PHP
php中array_unshift()修改数组key注意事项分析
May 16 PHP
PHP strcmp()和strcasecmp()的区别实例
Nov 05 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
Yii2.0实现的批量更新及批量插入功能示例
Jan 29 PHP
Yii框架安装简明教程
May 15 PHP
tp5.1 框架join方法用法实例分析
May 26 PHP
PHP mkdir创建文件夹实现方法解析
Nov 13 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编程最快明白》第七讲:php图片验证码与缩略图
2010/11/01 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
php 伪静态之IIS篇
2014/06/02 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
2015/10/29 Javascript
jQuery根据name属性进行查找的用法分析
2016/06/23 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
jQuery页面弹出框实现文件上传
2017/02/09 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
Django返回json数据用法示例
2016/09/18 Python
Python生成器以及应用实例解析
2018/02/08 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
Python 求向量的余弦值操作
2021/03/04 Python
简述数组与指针的区别
2014/01/02 面试题
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
经济学博士求职自荐信范文
2013/11/23 职场文书
银行存款证明样本
2014/01/17 职场文书
化验员岗位职责
2015/02/14 职场文书
2015年大学生实习评语
2015/03/25 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
 python中的元类metaclass详情
2022/05/30 Python