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