《PHP實戰:CI(CodeIgniter)模型用法實例分析》要點:
本文介紹了PHP實戰:CI(CodeIgniter)模型用法實例分析,希望對您有用。如果有疑問,可以聯系我們。
PHP應用本文實例分析了CI(CodeIgniter)模型用法.分享給大家供大家參考,具體如下:
PHP應用MVC中的業務邏輯放在控制器中或者模型里都是不合適的,所以這里對業務邏輯進行了分離,多出一層用來處理業務邏輯,模型就只當作數據拜訪層,這樣子模型將會變得比較輕.CI中并未通過實體對象來傳參,參數的傳入和返回都由開發者控制,比較靈活.很多情況下都會以數組的方式傳入或者返回.
PHP應用模型的使用也比較簡單,這里只提一下使用前想到的幾個問題吧.
PHP應用1、既然已經有了數據拜訪層了,那我們就應當避免在控制器或者某些類中直接通過SQL查詢數據庫,所有的數據庫拜訪操作都應當經過模型獲取,大多數情況下一個表名對應著一個模型類.
PHP應用2、模型應當很方便的連接多個數據庫,在database配置文件中有談到多個庫的配置問題,根據group_name的不同可以很方便的連接不同的庫.如果有主從,還可以考慮到主從的切換使用問題.
PHP應用3、模型是否還要按模塊區分?在控制器中存在公用控制器分發的做法,在模型中這種思維可能不太好,但可以通過繼承不同的公用模型類來實現,這些類再繼承CI的MY_Model.在某些業務下根據模塊來繼承可能比較有用,大部分情況可以直接繼承MY_Model,MY_Model主要實現數據庫的初始化連接以及一些公用辦法.
PHP應用4、數據庫提供的操作方式都是比較基礎的,需要我們根據自身的需求去組裝,但在我們日常操作中很多操作是類似的,如,根據主鍵獲取信息,根據ID獲取信息,根據屬性獲取信息等,可以對這些基礎的操作在進行一次封裝,更方便使用.因為如果要使用AR的方式來操作數據庫,需要記住很多的辦法,如我們根據用戶名查詢:
PHP應用
$query = $this->db->from('user')->where(array('username' => 'BobbyPeng'))->get();
return $query->row_array();
PHP應用如果封裝后,則只需要記住一個辦法即可,如:
PHP應用
public function findByAttributes($where = array())
{
$query = $this->db->from($this->tableName())->where($where)->get();
return $query->row_array();
}
PHP應用這樣子在每個模型中添加一個tableName的辦法返回表名后,再通過模型就可以很方便的使用該辦法了.
PHP應用5、上面的辦法屬于一個公用辦法,我們會寫在MY_Model中,但這種類似的辦法會很多,我們可否將該類型的辦法獨立于一個文件中?因為這種辦法大部分情況下是不會改的,而放在MY_Model中則表示對它的修改開放了,可能會影響到這些辦法.如果說該類叫ActiveRecord類,那可以讓MY_Model繼承ActiveRecord類,而ActiveRecord類繼承CI_Model,參考代碼見后面.
PHP應用很多時候類庫提供給我們的辦法都是比較細的,我們可以封裝一下,減少使用難度.關于模型中公用辦法的封裝一直還在考慮中,下面給出的只是一個針對單表的簡單的操作,復雜的操作就得在特定的模型中實現,還有一些公用操作或者說非AR的操作方式可以統一下,看以后是否有機會再來考慮下這個問題.
PHP應用公用AR封裝類,可進行常用的操作,需要賦予db屬性為數據庫連接對象,并在模型中設置幾個辦法,如主鍵、表名
PHP應用
<?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 */
PHP應用MY_Model可以繼承該類,這樣子模型中可以直接調用上面的辦法.
PHP應用
<?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 */
PHP應用更多關于CodeIgniter相關內容感興趣的讀者可查看本站專題:《codeigniter入門教程》和《CI(CodeIgniter)框架進階教程》
PHP應用希望本文所述對大家基于CodeIgniter框架的PHP程序設計有所贊助.
維易PHP培訓學院每天發布《PHP實戰:CI(CodeIgniter)模型用法實例分析》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7707.html