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

本文实例分析了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相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》和《CI(CodeIgniter)框架进阶教程》

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索codeigniter
, 模型
ci
codeigniter实例教程、codeigniter 分页实例、codeigniter开发实例、codeigniter 网站实例、codeigniter 实例,以便于您获取更多的相关知识。

时间: 2024-10-29 22:21:19

CI(CodeIgniter)模型用法实例分析_php实例的相关文章

CodeIgniter配置之database.php用法实例分析_php实例

本文实例分析了CodeIgniter配置之database.php用法.分享给大家供大家参考,具体如下: CodeIgniter的数据库配置文件位于application/config/database.php, 该文件中定义了$db的二维数组,参考文件如下: $active_group = 'default'; $active_record = TRUE; $db['default']['hostname'] = 'localhost'; $db['default']['username']

CodeIgniter配置之config.php用法实例分析_php实例

本文实例分析了CodeIgniter配置之config.php用法.分享给大家供大家参考,具体如下: 配置说明 $config['language']:指定项目语言包.需要注意的时Codeigniter自带的类库错误提示语言包位于/system/language/english/目录下,当这里配置非english时, 如果需要用到这些类库,则需要拷贝语言包到指定的目录中,否则会出现load出错. $config['charset']:设置系统使用的编码,在某些需要指定编码的函数中会用到,系统.数

CodeIgniter配置之routes.php用法实例分析_php实例

本文实例分析了CodeIgniter配置之routes.php用法.分享给大家供大家参考,具体如下: application/config/routes.php中定义了一个名为$route的数组,用来设置默认路由和404页面以及可以设置一些匹配方式. 默认的配置如下: $route['default_controller'] = "welcome"; $route['404_override'] = ''; default_controller指定默认的控制器名称,404_overri

CodeIgniter控制器之业务逻辑实例分析_php实例

本文实例分析了CodeIgniter控制器之业务逻辑.分享给大家供大家参考,具体如下: 前面分析了公用控制器按模块分发,方便对特定模块的控制,而具体的实现类则是放在library中.那放在library中是否合适呢?以及控制器中更多的业务逻辑该放在哪里? 先说下对CI中几个文件夹的理解 helpers.libraries: 存放一系列辅助函数.辅助类,用来辅助控制器.业务逻辑实现功能.他们中的方法应当尽量避免与CI依赖,依赖越紧越难以复用.以邮件发送为例,发送邮件时很多参数是不变的,如编码.协议

Symfony2开发之控制器用法实例分析_php实例

本文实例分析了Symfony2开发之控制器用法.分享给大家供大家参考,具体如下: 控制器是PHP函数,通过它,你可以根据HTTP请求创建任务信息,并且构建和返回HTTP响应.响应可以是HTML页面.XML文档.序列化的JSON数组.图片.重定向.404错误甚至是你可以想到的一切.控制器中包含了你应用程序需要创建响应的抽象逻辑. 接收请求,返回响应的基本生命周期 1.每个请求都被单个前端控制器(如app.php或index.php)文件处理,前端控制器负责引导框架: 2.路由查看并匹配请求信息,并

Symfony2 session用法实例分析_php实例

本文实例分析了Symfony2 session用法.分享给大家供大家参考,具体如下: Symfony自带有session的方法,以前老版本2.2及以前的session用法是 $session = $this->getRequest()->getSession(); $session->set('foo', 'bar'); $foobar = $session->get('foobar'); 后来Symfony2.3开始$this->getRequest()方法被废弃,sess

thinkphp连贯操作实例分析_php实例

本文实例分析了thinkphp连贯操作用法.分享给大家供大家参考.具体分析如下: 一.常用连贯操作,可以接连使用但没前后顺序之分,后面一定要有方法select,updata,delete,find 1.where:帮助我们设置查询条件 2.order:对结果进行排序 复制代码 代码如下: $arr=$m->order('id desc')->select();//字符串方法,默认是asc升序排列,加desc改为降序排列  $arr=$m->order(array('id'=>'de

Yii2中Restful API原理实例分析_php实例

本文实例分析了Yii2中Restful API原理.分享给大家供大家参考,具体如下: Yii2 有个很重要的特性是对 Restful API的默认支持, 通过短短的几个配置就可以实现简单的对现有Model的RESTful API 这里通过分析rest部分源码,简单剖析下yii2 实现 restful 的原理,并通过一些定制实现 对 关联模型的RESTful api 操作. ~ 代表 extends from 的关系 | | rest/ | | |-Action.php ~ `\yii\base\

PHP文件缓存smarty模板应用实例分析_php实例

本文实例分析了PHP文件缓存smarty模板应用.分享给大家供大家参考,具体如下: 一.使用缓存 要开启smarty的缓存,只需将caching设为true,并指定cache_dir即可. 使用cache_lefetime指定缓存生存时间,单位为秒 要对相同页面生成多个不同的缓存,在display或fetch中加入第二参数cache_id,如: $smarty->display('index.tpl',$my_cache_id); 此特性可用于对不同的$_GET进行不同的缓存  二.清除缓存 c