CodeIgniter 提供了查詢構造器類,查詢構造器容許你使用較少的代碼來在數據庫中 獲取、新增或更新數據。有時只須要一兩行代碼就能完成數據庫操做。CodeIgniter 並不須要爲每一個數據表提供一個類,而是使用了一種更簡單的接口。html
除了簡單,使用查詢構造器的另外一個好處就是可讓你建立數據庫獨立的應用程序,這是由於查詢語句是由每一個獨立的數據庫適配器生成的。另外,因爲系統會自動對數據進行轉義,因此它還能提供更安全的查詢。sql
註解:若是你想編寫本身的查詢語句,你能夠在數據庫配置文件中禁用這個類,這樣數據庫核心類庫和適配器將 使用 更少的資源。數據庫
下面的方法用來構建 SELECT 語句。數組
$query = $this->db->get('mytable')安全
// Produces: SELECT * FROM mytable
第二和第三個參數用於設置 LIMIT 子句:ide
$query = $this->db->get('mytable', 10, 20); // Executes: SELECT * FROM mytable LIMIT 20, 10 // (in MySQL. Other databases have slightly different syntax)
你應該已經注意到了,上面的方法的結果都賦值給了一個 $query 變量,經過這個變量, 咱們能夠獲得查詢的結果:codeigniter
$query = $this->db->get('mytable'); foreach ($query->result() as $row) { echo $row->title; }
該方法和 $this->db->get() 方法同樣編譯 SELECT 查詢並返回查詢的 SQL 語句, 可是,該方法並不執行它。ui
$sql = $this->db->get_compiled_select('mytable'); echo $sql; // Prints string: SELECT * FROM mytable
第二個參數用於設置是否重置查詢(默認會重置,和使用 $this->db->get() 方法時同樣):this
echo $this->db->limit(10,20)->get_compiled_select('mytable', FALSE); // Prints string: SELECT * FROM mytable LIMIT 20, 10 // (in MySQL. Other databases have slightly different syntax) echo $this->db->select('title, content, date')->get_compiled_select(); // Prints string: SELECT title, content, date FROM mytable LIMIT 20, 10
上面的例子中,最值得注意的是,第二個查詢並無用到 $this->db->from() 方法, 也沒有爲查詢指定表名參數,可是它生成的 SQL 語句中有 FROM mytable 子句。 這是由於查詢並無被重置(使用 $this->db->get() 方法查詢會被執行並被重置, 使用 $this->db->reset_query() 方法直接重置)。spa
這個方法基本上和上面的方法同樣,但它提供了第二個參數可讓你添加一個 WHERE 子句, 而不是使用 db->where() 方法:
$query = $this->db->get_where('mytable', array('id' => $id), $limit, $offset);
該方法用於編寫查詢語句中的 SELECT 子句:
$this->db->select('title, content, date'); $query = $this->db->get('mytable'); // Executes: SELECT title, content, date FROM mytable
該方法用於編寫查詢語句中的 SELECT MAX(field) 部分,你可使用第二個參數(可選)重命名結果字段。
$this->db->select_max('age'); $query = $this->db->get('members'); // Produces: SELECT MAX(age) as age FROM members $this->db->select_max('age', 'member_age'); $query = $this->db->get('members'); // Produces: SELECT MAX(age) as member_age FROM members
該方法用於編寫查詢語句中的 SELECT MIN(field) 部分,和 select_max() 方法同樣, 你可使用第二個參數(可選)重命名結果字段。
$this->db->select_min('age'); $query = $this->db->get('members'); // Produces: SELECT MIN(age) as age FROM members
該方法用於編寫查詢語句中的 SELECT AVG(field) 部分,和 select_max() 方法同樣, 你可使用第二個參數(可選)重命名結果字段。
$this->db->select_avg('age'); $query = $this->db->get('members'); // Produces: SELECT AVG(age) as age FROM members
該方法用於編寫查詢語句中的 SELECT SUM(field) 部分,和 select_max() 方法同樣, 你可使用第二個參數(可選)重命名結果字段。
$this->db->select_sum('age'); $query = $this->db->get('members'); // Produces: SELECT SUM(age) as age FROM members
該方法用於編寫查詢語句中的 FROM 子句:
$this->db->select('title, content, date'); $this->db->from('mytable'); $query = $this->db->get(); // Produces: SELECT title, content, date FROM mytable
該方法用於編寫查詢語句中的 JOIN 子句:
$this->db->select('*'); $this->db->from('blogs'); $this->db->join('comments', 'comments.id = blogs.id'); $query = $this->db->get(); // Produces: // SELECT * FROM blogs JOIN comments ON comments.id = blogs.id
若是你的查詢中有多個鏈接,你能夠屢次調用這個方法。
你能夠傳入第三個參數指定鏈接的類型,有這樣幾種選擇:left,right,outer,inner,left outer 和 right outer 。
$this->db->join('comments', 'comments.id = blogs.id', 'left'); // Produces: LEFT JOIN comments ON comments.id = blogs.id
2.1.1 result()方法以**對象數組**形式返回查詢結果,若是查詢時敗將返回**空數組**。 通常狀況下,你會像下面這樣在一個 foreach 循環中使用它:
$query = $this->db->query("YOUR QUERY"); foreach ($query->result() as $row) { echo $row->title; echo $row->name; echo $row->body; }
該方法是 result_object() 方法的別名。
你還能夠傳一個字符串參數給 result() 方法,這個字符串參數表明你想要把每一個結果轉換成某個類的類名(這個類必須已經加載)
$query = $this->db->query("SELECT * FROM users;"); foreach ($query->result('User') as $user) { echo $user->name; // access attributes echo $user->reverse_name(); // or methods defined on the 'User' class }
2.1.2 result_array() 方法
這個方法以 一個純粹的數組 形式返回查詢結果,若是無結果,則返回一個空數組。通常狀況下,你會像下面這樣在一個 foreach 循環中使用它:
$query = $this->db->query("YOUR QUERY"); foreach ($query->result_array() as $row) { echo $row['title']; echo $row['name']; echo $row['body']; }
2.2.1 row() 方法 這個方法返回單獨一行結果。若是你的查詢不止一行結果,它只返回第一行。返回的結果是 對象 形式,這裏是用例:
$query = $this->db->query("YOUR QUERY"); $row = $query->row(); if (isset($row)) { echo $row->title; echo $row->name; echo $row->body; }
若是你要返回特定行的數據,你能夠將行號做爲第一個參數傳給這個方法:
$row = $query->row(5);
你還能夠加上第二個參數,該參數爲字符串類型,表明你想要把結果轉換成某個類的類名:
$query = $this->db->query("SELECT * FROM users LIMIT 1;"); $row = $query->row(0, 'User'); echo $row->name; // access attributes echo $row->reverse_name(); // or methods defined on the 'User' class
2.2.2 row_array() 方法
這個方法除了返回結果是一個數組而不是一個對象以外,其餘的和上面的 row() 方法徹底同樣。舉例:
$query = $this->db->query("YOUR QUERY"); $row = $query->row_array(); if (isset($row)) { echo $row['title']; echo $row['name']; echo $row['body']; }
若是你要返回特定行的數據,你能夠將行號做爲第一個參數傳給這個方法:
另外,你可使用下面這些方法從你的結果集中獲取前一個、後一個、 第一個或者最後一個結果:
$row = $query->first_row()$row = $query->last_row()$row = $query->next_row()$row = $query->previous_row()
這些方法默認返回對象,若是須要返回數組形式,將單詞 "array" 做爲參數傳入方法便可:
$row = $query->first_row('array')$row = $query->last_row('array')$row = $query->next_row('array')$row = $query->previous_row('array')
Attention: 上面全部的這些方法都會把全部的結果加載到內存裏(預讀取), 當處理大結果集時最好使用 unbuffered_row() 方法。
2.2.3 unbuffered_row() 方法
$query = $this->db->query("YOUR QUERY"); while ($row = $query->unbuffered_row()) { echo $row->title; echo $row->name; echo $row->body; }
這個方法和 row()方法同樣返回單獨一行結果,可是它不會預讀取全部的結果數據到內存中。 若是你的查詢結果不止一行,它將返回當前一行,並經過內部實現的指針來移動到下一行。