CI(CodeIgniter)模型用法实例分析


Posted in PHP onJanuary 20, 2016

本文实例分析了CI(CodeIgniter)模型用法。分享给大家供大家参考,具体如下:

MVC中的业务逻辑放在控制器中或者模型里都是不合适的,所以这里对业务逻辑进行了分离,多出一层用来处理业务逻辑,模型就只当作数据访问层,这样子模型将会变得比较轻。CI中并未通过实体对象来传参,参数的传入和返回都由开发者控制,比较灵活。很多情况下都会以数组的方式传入或者返回。

模型的使用也比较简单,这里只提一下使用前想到的几个问题吧。

1、既然已经有了数据访问层了,那我们就应当避免在控制器或者某些类中直接通过SQL查询数据库,所有的数据库访问操作都应当经过模型获取,大多数情况下一个表名对应着一个模型类。

2、模型应当很方便的连接多个数据库,在database配置文件中有谈到多个库的配置问题,根据group_name的不同可以很方便的连接不同的库。如果有主从,还可以考虑到主从的切换使用问题。

3、模型是否还要按模块区分?在控制器中存在公用控制器分发的做法,在模型中这种思维可能不太好,但可以通过继承不同的公用模型类来实现,这些类再继承CI的MY_Model。在某些业务下根据模块来继承可能比较有用,大部分情况可以直接继承MY_Model,MY_Model主要实现数据库的初始化连接以及一些公用方法。

4、数据库提供的操作方式都是比较基础的,需要我们根据自身的需求去组装,但在我们日常操作中很多操作是类似的,如,根据主键获取信息,根据ID获取信息,根据属性获取信息等,可以对这些基础的操作在进行一次封装,更方便使用。因为如果要使用AR的方式来操作数据库,需要记住很多的方法,如我们根据用户名查询:

$query = $this->db->from('user')->where(array('username' => 'BobbyPeng'))->get();
return $query->row_array();

如果封装后,则只需要记住一个方法即可,如:

public function findByAttributes($where = array())
{
  $query = $this->db->from($this->tableName())->where($where)->get();
  return $query->row_array();
}

这样子在每个模型中添加一个tableName的方法返回表名后,再通过模型就可以很方便的使用该方法了。

5、上面的方法属于一个公用方法,我们会写在MY_Model中,但这种类似的方法会很多,我们可否将该类型的方法独立于一个文件中?因为这种方法大部分情况下是不会改的,而放在MY_Model中则表示对它的修改开放了,可能会影响到这些方法。如果说该类叫ActiveRecord类,那可以让MY_Model继承ActiveRecord类,而ActiveRecord类继承CI_Model,参考代码见后面。

很多时候类库提供给我们的方法都是比较细的,我们可以封装一下,减少使用难度。关于模型中公用方法的封装一直还在考虑中,下面给出的只是一个针对单表的简单的操作,复杂的操作就得在特定的模型中实现,还有一些公用操作或者说非AR的操作方式可以统一下,看以后是否有机会再来考虑下这个问题。

公用AR封装类,可进行常用的操作,需要赋予db属性为数据库连接对象,并在模型中设置几个方法,如主键、表名

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class ActiveRecord extends CI_Model
{
  /**
   * 保存数据
   * 
   * @param array $data 需要插入的表数据
   * @return boolean 插入成功返回ID,插入失败返回false
   */
  public function save($data)
  {
    if($this->db->set($data)->insert($this->tableName())) {
      return $this->db->insert_id();
    }
    return FALSE;
  }
  /**
   * Replace数据
   * @param array $data
   */
  public function replace($data)
  {
    return $this->db->replace($this->tableName(), $data);
  }
  /**
   * 根据主键更新记录
   * 
   * @param string $pk 主键值
   * @param array $attributes 更新字段
   * @param array $where 附加where条件
   * @return boolean true更新成功 false更新失败
   */
  public function updateByPk($pk, $attributes, $where = array())
  {
    $where[$this->primaryKey()] = $pk;
    return $this->updateAll($attributes, $where);
  }
  /**
   * 更新表记录
   * 
   * @param array $attributes
   * @param array $where
   * @return bollean true更新成功 false更新失败
   */
  public function updateAll($attributes, $where = array())
  {
    return $this->db->where($where)->update($this->tableName(), $attributes);
  }
  /**
   * 根据主键删除数据
   * 
   * @param string $pk 主键值
   * @param array $where 附加删除条件
   * @return boolean true删除成功 false删除失败 
   */
  public function deleteByPk($pk, $where = array())
  {
    $where[$this->primaryKey()] = $pk;
    return $this->deleteAll($where);
  }
  /**
   * 删除记录
   * 
   * @param array $where 删除条件
   * @param int $limit 删除行数
   * @return boolean true删除成功 false删除失败
   */
  public function deleteAll($where = array(), $limit = NULL)
  {
    return $this->db->delete($this->tableName(), $where, $limit);
  }
  /**
   * 根据主键检索
   * 
   * @param string $pk
   * @param array $where 附加查询条件
   * @return array 返回一维数组,未找到记录则返回空数组
   */
  public function findByPk($pk, $where = array())
  {
    $where[$this->primaryKey()] = $pk;
    $query = $this->db->from($this->tableName())->where($where)->get();
    return $query->row_array();
  }
  /**
   * 根据属性获取一行记录
   * @param array $where
   * @return array 返回一维数组,未找到记录则返回空数组
   */
  public function findByAttributes($where = array())
  {
    $query = $this->db->from($this->tableName())->where($where)->limit(1)->get();
    return $query->row_array();
  }
  /**
   * 查询记录
   * 
   * @param array $where 查询条件,可使用模糊查询,如array('name LIKE' => "pp%") array('stat >' => '1')
   * @param int $limit 返回记录条数
   * @param int $offset 偏移量
   * @param string|array $sort 排序, 当为数组的时候 如:array('id DESC', 'report_date ASC')可以通过第二个参数来控制是否escape
   * @return array 未找到记录返回空数组
   */
  public function findAll($where = array(), $limit = 0, $offset = 0, $sort = NULL)
  {
    $this->db->from($this->tableName())->where($where);
    if($sort !== NULL) {
      if(is_array($sort)){
        foreach($sort as $value){
          $this->db->order_by($value, '', false);
        }
      } else {
        $this->db->order_by($sort);
      }
    }
    if($limit > 0) {
      $this->db->limit($limit, $offset);
    }
    $query = $this->db->get();
    return $query->result_array();
  }
  /**
   * 统计满足条件的总数
   * 
   * @param array $where 统计条件
   * @return int 返回记录条数
   */
  public function count($where = array())
  {
    return $this->db->from($this->tableName())->where($where)->count_all_results();
  }
  /**
   * 根据SQL查询, 参数通过$param绑定
   * @param string $sql 查询语句,如SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?
   * @param array $param array(3, 'live', 'Rick')
   * @return array 未找到记录返回空数组,找到记录返回二维数组
   */
  public function query($sql, $param = array())
  {
    $query = $this->db->query($sql, $param);
    return $query->result_array();
  }
}
/* End of file ActiveRecord.php */
/* Location: ./application/core/database/ActiveRecord.php */

MY_Model可以继承该类,这样子模型中可以直接调用上面的方法。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
require_once APPPATH.'core/database/ActiveRecord.php';
class MY_Model extends ActiveRecord 
{
  public function __construct($group_name = '')
  {
    $this->initDb($group_name);
    parent::__construct();
  }
  protected function initDb($group_name = '')
  {
    $db_conn_name = $this->getDbName($group_name);
    $CI = & get_instance();
    if(isset($CI->{$db_conn_name}) && is_object($CI->{$db_conn_name})) {
      $this->db = $CI->{$db_conn_name};
    } else {
      $CI->{$db_conn_name} = $this->db = $this->load->database($group_name, TRUE);
    }
  }
  private function getDbName($group_name = '')
  {
    if($group_name == '') {
      $db_conn_name = 'db';
    } else {
      $db_conn_name = 'db_'.$group_name;
    }
    return $db_conn_name;
  }
}
/* End of file MY_Model.php */
/* Location: ./application/core/MY_Model.php */

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

PHP 相关文章推荐
IIS下配置Php+Mysql+zend的图文教程
Dec 08 PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
Sep 19 PHP
CodeIgniter使用smtp服务发送html邮件的方法
Jun 10 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
Yii框架中jquery表单验证插件用法示例
Oct 18 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
Laravel创建数据库表结构的例子
Oct 09 PHP
laravel 获取某个查询的查询SQL语句方法
Oct 12 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
php如何获取Http请求
Apr 30 PHP
PHP tp5中使用原生sql查询代码实例
Oct 28 PHP
教你php如何实现验证码
Jan 20 #PHP
CodeIgniter辅助之第三方类库third_party用法分析
Jan 20 #PHP
CodeIgniter扩展核心类实例详解
Jan 20 #PHP
CodeIgniter视图使用注意事项
Jan 20 #PHP
CodeIgniter读写分离实现方法详解
Jan 20 #PHP
PHP实现微信网页授权开发教程
Jan 19 #PHP
CodeIgniter配置之SESSION用法实例分析
Jan 19 #PHP
You might like
PHP的可变变量名的使用方法分享
2012/02/05 PHP
php中is_null,empty,isset,unset 的区别详细介绍
2013/04/28 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
php将图片保存为不同尺寸图片的图片类实例
2015/03/30 PHP
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
基于node实现websocket协议
2016/04/25 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
python 禁止函数修改列表的实现方法
2017/08/03 Python
基于Python中capitalize()与title()的区别详解
2017/12/09 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
利用Python实现kNN算法的代码
2019/08/16 Python
python通过链接抓取网站详解
2019/11/20 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
Python 创建TCP服务器的方法
2020/07/28 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
2014年公司迎新年活动方案
2014/02/24 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
社会发展项目建议书
2014/08/25 职场文书
领导欢迎词致辞
2015/01/23 职场文书
在人间读书笔记
2015/06/30 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
2016先进集体事迹材料范文
2016/02/25 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis