模型
模型對于那些想用傳統(tǒng)MVC方式的人來說是可選的。
- 什么是模型?
- 剖析模型
- 載入模型
- 自動載入模型
- 連接數(shù)據(jù)庫
什么是模型?
模型是專門用來和數(shù)據(jù)庫打交道的PHP類。例如,假設(shè)你想用CodeIgniter來做一個Blog。你可以寫一個模型類,里面包含插入、更新、刪除Blog數(shù)據(jù)的方法。下面的例子將向你展示一個普通的模型類:
class?Blogmodel?extends?CI_Model?{
????var $title?? = '';
????var $content = '';
????var $date??? = '';
????function?__construct()
????{
????????parent::__construct();
????}
????
????function?get_last_ten_entries()
????{
????????$query = $this->db->get('entries', 10);
????????return $query->result();
????}
????function?insert_entry()
????{
????????$this->title?? = $_POST['title']; // 請閱讀下方的備注
????????$this->content = $_POST['content'];
????????$this->date??? = time();
????????$this->db->insert('entries',?$this);
????}
????function?update_entry()
????{
????????$this->title?? = $_POST['title'];
????????$this->content = $_POST['content'];
????????$this->date??? = time();
????????$this->db->update('entries',?$this, array('id' => $_POST['id']));
????}
}
注意: 上面用到的函數(shù)是 Active Record 數(shù)據(jù)庫函數(shù).
備注: 為了簡單一點,我們直接使用了$_POST。不過,這不太好,平時我們應該使用 輸入類:$this->input->post('title')
剖析模型
模型類文件存放在 application/models/ 文件夾。 如果你愿意,可以在里面建立子文件夾。
最基本的模型類必須像這樣:
class?Model_name?extends?CI_Model?{
????function?__construct()
????{
????????parent::__construct();
????}
}
Model_name 是模型類的名字。 類名的首字母必須大寫,其他字母小寫。 并且確保你的類繼承了基本模型類(Base Model Class)。
文件名應該是模型類名的小寫版。比如,如果你的類是:
class?User_model?extends?CI_Model?{
????function?__construct()
????{
????????parent::__construct();
????}
}
類的文件名應該是:
application/models/user_model.php
載入模型
模型可以在 控制器 中被引用。 就像這樣:
$this->load->model('Model_name');
如果模型文件在子文件夾下,引用的時候要帶上相對路徑名。例如:如果你有一個模型 application/models/blog/queries.php。 下面的代碼可以引用它:
$this->load->model('blog/queries');
模型一旦被載入,你就能通過下面的方法使用它:
$this->load->model('Model_name');
$this->Model_name->function();
在默認的情況下模型名稱就直接被引入作為對象名,就如上面所示。當然,如果你愿意,可以起個更好記的對象名!那么,可以在加載模型函數(shù)中指定第二個參數(shù)來設(shè)定,例如:
$this->load->model('Model_name', 'fubar');
$this->fubar->function();
這里有個控制器的例子,加載一個模型,然后通過視圖顯示出來
class?Blog_controller?extends?CI_Controller?{
????function?blog()
????{
????????$this->load->model('Blog');
????????$data['query'] = $this->Blog->get_last_ten_entries();
????????$this->load->view('blog', $data);
????}
}
自動載入模型
如果您需要一個在整個項目中都起作用的特定模型,您可以讓 CodeIgniter 在初始化時自動裝載它。實現(xiàn)的方法是打開 application/config/autoload.php 文件,然后在自動裝載數(shù)組中添加上這個模型。
備注: 經(jīng)過測試(以加載一個模型為例)自動加載模型和手動載入模型時,消耗的內(nèi)存情況是一樣的!但是當加載模型越多消耗內(nèi)存就會越大。自動加載模型是要犧牲內(nèi)存消耗換取的,所以盡量不要自動加載不必要貫穿全站項目的模型!
連接到數(shù)據(jù)庫
當一個模型被載入時,它并不會自動連接數(shù)據(jù)庫。以下方法可以使您連接數(shù)據(jù)庫:
- 您可以使用標準方法來連接數(shù)據(jù)庫(說明), 也可以通過控制器或者您的自定義模型。
- 您可以把第三個參數(shù)設(shè)置為TRUE來使模型裝載函數(shù)自動連接數(shù)據(jù)庫,連接配置可以在您的數(shù)據(jù)庫配置文件中可以定義:
- 您可以手動設(shè)定第三個參數(shù)來載入您的自定義數(shù)據(jù)庫配置:
$config['hostname'] = "localhost";
$config['username'] = "myusername";
$config['password'] = "mypassword";
$config['database'] = "mydatabase";
$config['dbdriver'] = "mysql";
$config['dbprefix'] = "";
$config['pconnect'] = FALSE;
$config['db_debug'] = TRUE;
$this->load->model('Model_name', '', $config);
$this->load->model('Model_name', '', TRUE);
備注: 經(jīng)過友好鏈接測試(也即只連接數(shù)據(jù)庫不涉及查詢),自動連接數(shù)據(jù)庫和手動連接數(shù)據(jù)庫時,消耗的內(nèi)存情況是一樣的,我本人的本機測試是0.67M
?