您好,登錄后才能下訂單哦!
小編給大家分享一下CI模型怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
具體如下:
MVC中的業(yè)務(wù)邏輯放在控制器中或者模型里都是不合適的,所以這里對(duì)業(yè)務(wù)邏輯進(jìn)行了分離,多出一層用來處理業(yè)務(wù)邏輯,模型就只當(dāng)作數(shù)據(jù)訪問層,這樣子模型將會(huì)變得比較輕。CI中并未通過實(shí)體對(duì)象來傳參,參數(shù)的傳入和返回都由開發(fā)者控制,比較靈活。很多情況下都會(huì)以數(shù)組的方式傳入或者返回。
模型的使用也比較簡(jiǎn)單,這里只提一下使用前想到的幾個(gè)問題吧。
1、既然已經(jīng)有了數(shù)據(jù)訪問層了,那我們就應(yīng)當(dāng)避免在控制器或者某些類中直接通過SQL查詢數(shù)據(jù)庫,所有的數(shù)據(jù)庫訪問操作都應(yīng)當(dāng)經(jīng)過模型獲取,大多數(shù)情況下一個(gè)表名對(duì)應(yīng)著一個(gè)模型類。
2、模型應(yīng)當(dāng)很方便的連接多個(gè)數(shù)據(jù)庫,在database配置文件中有談到多個(gè)庫的配置問題,根據(jù)group_name的不同可以很方便的連接不同的庫。如果有主從,還可以考慮到主從的切換使用問題。
3、模型是否還要按模塊區(qū)分?在控制器中存在公用控制器分發(fā)的做法,在模型中這種思維可能不太好,但可以通過繼承不同的公用模型類來實(shí)現(xiàn),這些類再繼承CI的MY_Model。在某些業(yè)務(wù)下根據(jù)模塊來繼承可能比較有用,大部分情況可以直接繼承MY_Model,MY_Model主要實(shí)現(xiàn)數(shù)據(jù)庫的初始化連接以及一些公用方法。
4、數(shù)據(jù)庫提供的操作方式都是比較基礎(chǔ)的,需要我們根據(jù)自身的需求去組裝,但在我們?nèi)粘2僮髦泻芏嗖僮魇穷愃频?,如,根?jù)主鍵獲取信息,根據(jù)ID獲取信息,根據(jù)屬性獲取信息等,可以對(duì)這些基礎(chǔ)的操作在進(jìn)行一次封裝,更方便使用。因?yàn)槿绻褂肁R的方式來操作數(shù)據(jù)庫,需要記住很多的方法,如我們根據(jù)用戶名查詢:
$query = $this->db->from('user')->where(array('username' => 'BobbyPeng'))->get(); return $query->row_array();
如果封裝后,則只需要記住一個(gè)方法即可,如:
public function findByAttributes($where = array()) { $query = $this->db->from($this->tableName())->where($where)->get(); return $query->row_array(); }
這樣子在每個(gè)模型中添加一個(gè)tableName的方法返回表名后,再通過模型就可以很方便的使用該方法了。
5、上面的方法屬于一個(gè)公用方法,我們會(huì)寫在MY_Model中,但這種類似的方法會(huì)很多,我們可否將該類型的方法獨(dú)立于一個(gè)文件中?因?yàn)檫@種方法大部分情況下是不會(huì)改的,而放在MY_Model中則表示對(duì)它的修改開放了,可能會(huì)影響到這些方法。如果說該類叫ActiveRecord類,那可以讓MY_Model繼承ActiveRecord類,而ActiveRecord類繼承CI_Model,參考代碼見后面。
很多時(shí)候類庫提供給我們的方法都是比較細(xì)的,我們可以封裝一下,減少使用難度。關(guān)于模型中公用方法的封裝一直還在考慮中,下面給出的只是一個(gè)針對(duì)單表的簡(jiǎn)單的操作,復(fù)雜的操作就得在特定的模型中實(shí)現(xiàn),還有一些公用操作或者說非AR的操作方式可以統(tǒng)一下,看以后是否有機(jī)會(huì)再來考慮下這個(gè)問題。
公用AR封裝類,可進(jìn)行常用的操作,需要賦予db屬性為數(shù)據(jù)庫連接對(duì)象,并在模型中設(shè)置幾個(gè)方法,如主鍵、表名
<?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ù)組的時(shí)候 如:array('id DESC', 'report_date ASC')可以通過第二個(gè)參數(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)計(jì)滿足條件的總數(shù) * * @param array $where 統(tǒng)計(jì)條件 * @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 */
以上是“CI模型怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。