CI(CodeIgniter)模型用法執行個體分析,cicodeigniter_PHP教程

來源:互聯網
上載者:User

CI(CodeIgniter)模型用法執行個體分析,cicodeigniter


本文執行個體分析了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自訂控制器MY_Controller用法分析
  • Codeigniter控制器controller繼承問題執行個體分析
  • 2個Codeigniter檔案批量上傳控制器寫法例子
  • CodeIgniter鉤子用法執行個體詳解
  • CodeIgniter配置之database.php用法執行個體分析
  • CodeIgniter多語言實現方法詳解
  • CodeIgniter視圖使用注意事項
  • CodeIgniter讀寫分離實現方法詳解
  • CI(CodeIgniter)簡單統計訪問人數實現方法
  • CodeIgniter控制器之商務邏輯執行個體分析

http://www.bkjia.com/PHPjc/1094765.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1094765.htmlTechArticleCI(CodeIgniter)模型用法執行個體分析,cicodeigniter 本文執行個體分析了CI(CodeIgniter)模型用法。分享給大家供大家參考,具體如下: MVC中的商務邏輯放在...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.