最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2016年01月20日 10:27:54   作者:老彭  
這篇文章主要介紹了CI(CodeIgniter)模型用法,結(jié)合實例形式分析了CodeIgniter框架中模型的功能、使用方法與相關(guān)注意事項,需要的朋友可以參考下

本文實例分析了CI(CodeIgniter)模型用法。分享給大家供大家參考,具體如下:

MVC中的業(yè)務(wù)邏輯放在控制器中或者模型里都是不合適的,所以這里對業(yè)務(wù)邏輯進行了分離,多出一層用來處理業(yè)務(wù)邏輯,模型就只當(dāng)作數(shù)據(jù)訪問層,這樣子模型將會變得比較輕。CI中并未通過實體對象來傳參,參數(shù)的傳入和返回都由開發(fā)者控制,比較靈活。很多情況下都會以數(shù)組的方式傳入或者返回。

模型的使用也比較簡單,這里只提一下使用前想到的幾個問題吧。

1、既然已經(jīng)有了數(shù)據(jù)訪問層了,那我們就應(yīng)當(dāng)避免在控制器或者某些類中直接通過SQL查詢數(shù)據(jù)庫,所有的數(shù)據(jù)庫訪問操作都應(yīng)當(dāng)經(jīng)過模型獲取,大多數(shù)情況下一個表名對應(yīng)著一個模型類。

2、模型應(yīng)當(dāng)很方便的連接多個數(shù)據(jù)庫,在database配置文件中有談到多個庫的配置問題,根據(jù)group_name的不同可以很方便的連接不同的庫。如果有主從,還可以考慮到主從的切換使用問題。

3、模型是否還要按模塊區(qū)分?在控制器中存在公用控制器分發(fā)的做法,在模型中這種思維可能不太好,但可以通過繼承不同的公用模型類來實現(xiàn),這些類再繼承CI的MY_Model。在某些業(yè)務(wù)下根據(jù)模塊來繼承可能比較有用,大部分情況可以直接繼承MY_Model,MY_Model主要實現(xiàn)數(shù)據(jù)庫的初始化連接以及一些公用方法。

4、數(shù)據(jù)庫提供的操作方式都是比較基礎(chǔ)的,需要我們根據(jù)自身的需求去組裝,但在我們?nèi)粘2僮髦泻芏嗖僮魇穷愃频?,如,根?jù)主鍵獲取信息,根據(jù)ID獲取信息,根據(jù)屬性獲取信息等,可以對這些基礎(chǔ)的操作在進行一次封裝,更方便使用。因為如果要使用AR的方式來操作數(shù)據(jù)庫,需要記住很多的方法,如我們根據(jù)用戶名查詢:

$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,參考代碼見后面。

很多時候類庫提供給我們的方法都是比較細的,我們可以封裝一下,減少使用難度。關(guān)于模型中公用方法的封裝一直還在考慮中,下面給出的只是一個針對單表的簡單的操作,復(fù)雜的操作就得在特定的模型中實現(xiàn),還有一些公用操作或者說非AR的操作方式可以統(tǒng)一下,看以后是否有機會再來考慮下這個問題。

公用AR封裝類,可進行常用的操作,需要賦予db屬性為數(shù)據(jù)庫連接對象,并在模型中設(shè)置幾個方法,如主鍵、表名

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class ActiveRecord extends CI_Model
{
  /**
   * 保存數(shù)據(jù)
   * 
   * @param array $data 需要插入的表數(shù)據(jù)
   * @return boolean 插入成功返回ID,插入失敗返回false
   */
  public function save($data)
  {
    if($this->db->set($data)->insert($this->tableName())) {
      return $this->db->insert_id();
    }
    return FALSE;
  }
  /**
   * Replace數(shù)據(jù)
   * @param array $data
   */
  public function replace($data)
  {
    return $this->db->replace($this->tableName(), $data);
  }
  /**
   * 根據(jù)主鍵更新記錄
   * 
   * @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);
  }
  /**
   * 根據(jù)主鍵刪除數(shù)據(jù)
   * 
   * @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 刪除行數(shù)
   * @return boolean true刪除成功 false刪除失敗
   */
  public function deleteAll($where = array(), $limit = NULL)
  {
    return $this->db->delete($this->tableName(), $where, $limit);
  }
  /**
   * 根據(jù)主鍵檢索
   * 
   * @param string $pk
   * @param array $where 附加查詢條件
   * @return array 返回一維數(shù)組,未找到記錄則返回空數(shù)組
   */
  public function findByPk($pk, $where = array())
  {
    $where[$this->primaryKey()] = $pk;
    $query = $this->db->from($this->tableName())->where($where)->get();
    return $query->row_array();
  }
  /**
   * 根據(jù)屬性獲取一行記錄
   * @param array $where
   * @return array 返回一維數(shù)組,未找到記錄則返回空數(shù)組
   */
  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 返回記錄條數(shù)
   * @param int $offset 偏移量
   * @param string|array $sort 排序, 當(dāng)為數(shù)組的時候 如:array('id DESC', 'report_date ASC')可以通過第二個參數(shù)來控制是否escape
   * @return array 未找到記錄返回空數(shù)組
   */
  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();
  }
  /**
   * 統(tǒng)計滿足條件的總數(shù)
   * 
   * @param array $where 統(tǒng)計條件
   * @return int 返回記錄條數(shù)
   */
  public function count($where = array())
  {
    return $this->db->from($this->tableName())->where($where)->count_all_results();
  }
  /**
   * 根據(jù)SQL查詢, 參數(shù)通過$param綁定
   * @param string $sql 查詢語句,如SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?
   * @param array $param array(3, 'live', 'Rick')
   * @return array 未找到記錄返回空數(shù)組,找到記錄返回二維數(shù)組
   */
  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可以繼承該類,這樣子模型中可以直接調(diào)用上面的方法。

<?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 */

更多關(guān)于CodeIgniter相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《codeigniter入門教程》和《CI(CodeIgniter)框架進階教程

希望本文所述對大家基于CodeIgniter框架的PHP程序設(shè)計有所幫助。

相關(guān)文章

  • 對laravel的csrf 防御機制詳解,及form中csrf_token()的存在介紹

    對laravel的csrf 防御機制詳解,及form中csrf_token()的存在介紹

    對laravel的csrf 防御機制詳解,及對laravel的csrf 防御機制詳解,及form中csrf_token()的存在介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • laravel實現(xiàn)分頁樣式替換示例代碼(增加首、尾頁)

    laravel實現(xiàn)分頁樣式替換示例代碼(增加首、尾頁)

    這篇文章主要給大家介紹了關(guān)于laravel實現(xiàn)分頁樣式替換的相關(guān)資料,實現(xiàn)了增加首、尾頁的功能,文章通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-09-09
  • Zend Framework教程之動作的基類Zend_Controller_Action詳解

    Zend Framework教程之動作的基類Zend_Controller_Action詳解

    這篇文章主要介紹了Zend Framework教程之動作的基類Zend_Controller_Action的用法,結(jié)合實例形式詳細分析了動作的基類Zend_Controller_Action具體功能,使用方法與相關(guān)注意事項,需要的朋友可以參考下
    2016-03-03
  • PHP加密3DES報錯 Call to undefined function: mcrypt_module_open() 如何解決

    PHP加密3DES報錯 Call to undefined function: mcrypt_module_open()

    這篇文章主要介紹了PHP加密3DES報錯 Call to undefined function: mcrypt_module_open() 如何解決的相關(guān)資料,需要的朋友可以參考下
    2016-04-04
  • thinkPHP連接sqlite3數(shù)據(jù)庫的實現(xiàn)方法(附Thinkphp代碼生成器下載)

    thinkPHP連接sqlite3數(shù)據(jù)庫的實現(xiàn)方法(附Thinkphp代碼生成器下載)

    這篇文章主要介紹了thinkPHP連接sqlite3數(shù)據(jù)庫的實現(xiàn)方法,涉及thinkPHP的數(shù)據(jù)庫相關(guān)配置技巧,并附帶了Thinkphp代碼生成器供讀者下載使用,需要的朋友可以參考下
    2016-05-05
  • Laravel使用支付寶進行支付的示例代碼

    Laravel使用支付寶進行支付的示例代碼

    本篇文章主要介紹了Laravel使用支付寶進行支付的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • PHP DataGrid 實現(xiàn)代碼

    PHP DataGrid 實現(xiàn)代碼

    最近想做一個通過PHP實現(xiàn)DataGrid功能的東西,這樣可以直接修改數(shù)據(jù)庫中表的內(nèi)容,而不用開發(fā)【新增數(shù)據(jù)頁面】,【編輯頁面】,于是乎在網(wǎng)上找了找,類似的東西也有幾個,開源的、付費的都有,不過基本都是基于MySQL。
    2009-08-08
  • ThinkPHP3.2.3框架實現(xiàn)的空模塊、空控制器、空操作,跳轉(zhuǎn)到錯誤404頁面圖文詳解

    ThinkPHP3.2.3框架實現(xiàn)的空模塊、空控制器、空操作,跳轉(zhuǎn)到錯誤404頁面圖文詳解

    這篇文章主要介紹了ThinkPHP3.2.3框架實現(xiàn)的空模塊、空控制器、空操作,跳轉(zhuǎn)到錯誤404頁面,結(jié)合圖文形式詳細分析了thinkPHP3.2.3框架空模塊、空控制器、空操作,跳轉(zhuǎn)到錯誤404頁面具體操作步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-04-04
  • 簡單分析ucenter 會員同步登錄通信原理

    簡單分析ucenter 會員同步登錄通信原理

    UCenter是Comsenz旗下各個產(chǎn)品之間信息直接傳遞的一個橋梁,通過UCenter 站長可以無縫整合Comsenz系列產(chǎn)品,實現(xiàn)用戶的一站式登錄以及社區(qū)其他數(shù)據(jù)的交互。其實何止是comsenz系列產(chǎn)品,可以這么說整合了 ucenter 就等于整合了整個php 界的所有php 程序。
    2014-08-08
  • Yii框架連接mongodb數(shù)據(jù)庫的代碼

    Yii框架連接mongodb數(shù)據(jù)庫的代碼

    這篇文章主要介紹了Yii框架連接mongodb數(shù)據(jù)庫的代碼的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07

最新評論

财经| 屯门区| 衡山县| 颍上县| 申扎县| 石门县| 铜川市| 鹿泉市| 同江市| 邳州市| 徐闻县| 昌吉市| 张北县| 和林格尔县| 万山特区| 米脂县| 龙口市| 龙门县| 思茅市| 海城市| 江川县| 翁牛特旗| 安乡县| 太和县| 武山县| 棋牌| 馆陶县| 晋城| 云安县| 循化| 犍为县| 高要市| 千阳县| 吴桥县| 会泽县| 钦州市| 会理县| 绍兴县| 贞丰县| 华蓥市| 珠海市|