模型是專門用來和數據庫打交道的PHP類。例如,假設你想用CodeIgniter來做一個Blog。你可以寫一個模型類,里面包含插入、更新、刪除Blog數據的方法。
下面的例子將向你展示一個普通的模型類:
<?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'])); }}?>
備注: 為了簡單一點,我們直接使用了$_POST。
不過,這不太好,平時我們應該使用輸類:
$this->input->post('title');
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');
$this->load->model('blog/queries');
$this->load->model('Model_name');$this->Model_name->function();
$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); }}
備注: 經過測試(以加載一個模型為例)自動加載模型和手動載入模型時,消耗的內存情況是一樣的。
但是當加載模型越多消耗內存就會越大。自動加載模型是要犧牲內存消耗換取的,所以盡量不要自動加載不必要貫穿全站項目的模型!
$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);
下面是我在SAE中連接數據庫使用的Model,封裝了一些常用到的方法,比如Select,Insert等等。
<?class sae_sql_model extends CI_Model { var $mysql; var $sql; function __construct() { parent::__construct(); $this->mysql = new SaeMysql(); } /*MySQL的Select查詢函數,函數的參數依次為: *1.表名-2.列名-3.開始的行數-4.查詢的函數 */ function select_limit($table_name,$row_name,$start_row,$row_count) { $this->sql = "SELECT ".$row_name." FROM `".$table_name."` LIMIT ".$start_row.",".$row_count.""; $data = $this->mysql->getData($this->sql); return $data; } /*MySQL的Select查詢函數,函數的參數依次為: *1.表名-2.列名-3.查詢的列名-4.查詢的目標 */ function select_where($table_name,$row_name,$where_row,$target_row) { $this->sql = "SELECT ".$row_name." FROM `".$table_name."` WHERE `".$where_row."`=" .$target_row; $data = $this->mysql->getData($this->sql); return $data; } /*MySQL的Insert插入函數,函數的參數依次為: *1.表名-2.插入數據的關聯數組 */ function insert_into($table_name,$array_data) { //$tempKey和$tempValue兩個數組臨時存儲插入的數據 $temp_key_string = ""; $temp_value_string = ""; //遍歷取出關聯數組中的數據并將其存儲在字符串中 foreach($array_data as $key=>$value) { $temp_key_string .= "`".$key."`,"; $temp_value_string .= "'".$value."',"; } //除去末尾的逗號 $temp_key_string = substr($temp_key_string,0,-1); $temp_value_string = substr($temp_value_string,0,-1); //組裝Insert的SQL語句 $this->sql = "INSERT INTO `".$table_name."` (".$temp_key_string.") VALUES (".$temp_value_string.");"; //運行Insert的SQL語句 $this->mysql->run_sql($this->sql); } //測試輸出的函數 function select_output($array_data,$row_name) { foreach($array_data as $key=>$value) { echo $value[$row_name]; } }}?>
下面是幾個簡單的調用的例子:
//連接數據庫并返回查詢結果$sqlData = $this->sql_model->select_limit('Entries','*',0,10); //將數據庫的結果傳入data中$data['query']=$sqlData;//使用變量$data向目標網頁傳入數據$this->load->view('blog_view',$data);
//將要插入的數據存入關聯數組中$data_array['entry_id'] = $_POST['entry_id'];$data_array['body'] = $_POST['body'];$data_array['author'] = $_POST['author'];//執行SQL語句$sqlData = $this->sql_model->insert_into('Comments',$data_array);