模型(Models)
對於要使用更傳統的MVC取向的人而言,模型(Models)是非必須的。
什麼是模型(Model)?
模型(Models)是設計來處理你資料庫中資訊的類別。 例如,假設你用CodeIgniter來管理部落格,你也許會有一個包含新增、更新以及取得部落格資料等功能的模型類別。 舉例來說,這樣的模型類別或許看起來會像:
class Blogmodel extends CI_Model {
var $title = '';
var $content = '';
var $date = '';
function __construct()
{
// 呼叫模型(Model)的建構函數
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']));
}
}
注意:上例的函數中使用了Active Record資料庫函數。
注意:為了簡化起見,在這個例子中我們直接使用$_POST變數。這通常是不好的做法,更常見的做法是使用 Input Class: $this->input->post('title')
模型(Model)剖析
模型(Model)類別放在你的application/models/目錄中。它們允許用子目錄來做巢狀,如果你要用這種方式來組織的話。
模型(model)類別的基本原型是:
class Model_name extends CI_Model {
function __construct()
{
parent::__construct();
}
}
在此Model_name是你的類別名稱。類別名稱必須第一個字母大寫其餘的字母小寫。 確認你的類別繼承(extends)基本的Model類別。
檔案名稱是全部小寫的類別名稱。舉個例子,假設你的類別如下:
class User_model extends CI_Model {
function __construct()
{
parent::__construct();
}
}
你的檔案會是:
application/models/user_model.php
模型(Model)載入
你的模型(models)只有在你的控制器(controller)函數中才會被載入及呼叫。 要載入一個模型(model)你要用以下的函數:
$this->load->model('Model_name');
如果你的模型(model)放在一個子目錄中,要加上相對於模型(models)目錄的相對路徑。例如, 如果你的模型(model)放在application/models/blog/queries.php,你要這樣載入:
$this->load->model('blog/queries');
一旦載入了,你就可以使用與類別同名的物件來存取模型(model)函數:
$this->load->model('Model_name');
$this->Model_name->function();
如果你要將模型(model)指定一個不同的物件名稱,你可以透過載入函數的第二個參數來做:
$this->load->model('Model_name','fubar');
$this->fubar->function();
這裡有個控制器(controller)範例,它會載入一個模型(model),然後備置一個檢視(view):
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);
}
}
模型(Model)自動載入
如果你發現你需要範圍遍及整個應用的特別模型(model),你可以告訴CodeIgniter在系統初始化的時候自動載入它。 這可由開啟 application/config/autoload.php 檔案並把這個模型(model)加入autoload陣列做到。
連接到你的資料庫
當一個模型(model)載入時,它不會自動連接到你的資料庫。以下為你可以使用的連接選項:
- 你可以使用這裡描述的標準資料庫方法來連接,從你的控制器(Controller)類別或是模型(Model)類別都可以。
- 你可以經由傳給模型(model)載入函數的第三個參數TRUE (boolean)去自動連接。這時會使用定義在資料庫設定檔中的連接設定。
$this->load->model('Model_name','',TRUE); - 你可以透過這第三個參數手動傳遞資料庫連接設定:
$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);