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 chr() ord()中文截取乱码问题解决方法
Sep 08 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
深入php-fpm的两种进程管理模式详解
Jun 03 PHP
解析ajax事件的调用顺序
Jun 17 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
php中的字符编码转换函数用法示例
Oct 20 PHP
php导入大量数据到mysql性能优化技巧
Dec 29 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
PHP解耦的三重境界(浅谈服务容器)
Mar 13 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 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
BBS(php &amp; mysql)完整版(六)
2006/10/09 PHP
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
php实现zip文件解压操作
2015/11/03 PHP
学习YUI.Ext 第二天
2007/03/10 Javascript
jQuery 全选效果实现代码
2009/03/23 Javascript
JavaScript prototype对象的属性说明
2010/03/13 Javascript
Jquery图形报表插件 jqplot简介及参数详解
2012/10/10 Javascript
在新窗口打开超链接的方法小结
2013/04/14 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
node.js中的http.request方法使用说明
2014/12/14 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
推荐三款日期选择插件(My97DatePicker、jquery.datepicker、Mobiscroll)
2017/04/21 jQuery
NodeJs实现定时任务的示例代码
2017/12/05 NodeJs
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
Python中的lstrip()方法使用简介
2015/05/19 Python
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Python3.4实现远程控制电脑开关机
2018/02/22 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
python实现PID算法及测试的例子
2019/08/08 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
用python实现一个简单计算器(完整DEMO)
2020/10/14 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
中文系师范生自荐信
2013/10/01 职场文书
软件售后服务方案
2014/05/29 职场文书
带刀到教室的检讨书
2014/10/04 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers