以前接觸的都是sql原生語句,thinkPHP作了封裝,不過適應起來仍是挺快的。php
記錄了幾個經常使用的例子,還有其餘形式的,本文沒有記錄。html
目錄 |
1. 增 |
2. 刪 |
3. 改 |
4. 查 |
4.1 select |
4.2 find |
4.3 getBy |
4.4 getField |
4.5 區間查詢 |
4.6 原生SQL查詢 |
4.7 統計查詢 |
4.7.1 count |
4.7.2 max |
4.7.3 min |
4.7.4 avg |
4.7.5 sum |
ThinkPHP 內置的 add 方法用於向數據表添加數據,至關於 SQL 中的 INSERT INTO 行爲。mysql
1 public function insert(){ 2 header("Content-Type:text/html; charset=utf-8"); 3 $Dao = M("User"); // 實例化模型類 4 5 // 構建寫入的數據數組 6 $data["username"] = "小王"; 7 $data["password"] = md5("123456"); 8 $data["email"] = "12345@163.com"; 9 $data["regdate"] = time(); 10 11 // 寫入數據 12 $insertM = $Dao->add($data); 13 }
等同於SQL語句:sql
INSERT INTO user(username,password,email,regdate) VALUES ('小王','e10adc3949ba59abbe56e057f20f883e','12345@163.com',1486974334);
delete() 方法執行成功返回操做影響(刪除)的記錄數。數據庫
1 public function del(){ 2 header("Content-Type:text/html; charset=utf-8"); 3 $Dao = M("User"); 4 // 刪除 uid=5 的數據記錄 5 $result = $Dao->where('uid = 5')->delete(); 6 }
等同於SQL語句:數組
DELETE FROM user WHERE uid = 5;
ThinkPHP 內置的 save() 方法用於向數據表更新數據,至關於 SQL 中的 UPDATE 行爲。緩存
1 public function update(){ 2 header("Content-Type:text/html; charset=utf-8"); 3 $Dao = M("User"); 4 5 // 須要更新的數據 6 $data['email'] = 'Jack@163.com'; 7 // 更新的條件 8 $condition['username'] = 'Jack'; 9 $result = $Dao->where($condition)->save($data); 10 //或者:$resul t= $Dao->where($condition)->data($data)->save(); 11 }
等同於SQL語句:安全
UPDATE user SET email='Jack@163.com' WHERE username='Jack';
提示ide
爲了保證數據庫的安全,避免出錯更新整個數據表,若是沒有任何更新條件,數據對象自己也不包含主鍵字段的話,save方法不會更新任何數據庫的記錄。大數據
所以要使用 save() 方法更新數據,必須指定更新條件或者更新的數據中包含主鍵字段。
ThinkPHP 查詢數據主要提供如下幾類查詢:
是 ThinkPHP 中最經常使用的普通查詢方法,獲得的是一個二維數組。
1 //方法php 2 public function read(){ 3 $Dao = M("User"); 4 5 // 查詢數據 6 $list = $Dao->select(); 7 //dump($list); // 用 dump() 能夠在調試階段查看數據是否已讀取 8 9 // 模板變量賦值 10 $this->assign("list", $list); 11 // 輸出模板 12 $this->display(); 13 } 14 15 //模板html 16 <table border="1"> 17 <tr> 18 <th width="10%">ID</th> 19 <th width="30%">用戶名</th> 20 <th width="30%">電子郵件</th> 21 <th>註冊時間</th> 22 </tr> 23 <volist name="list" id="vo">//循環顯示 24 <tr> 25 <td align="center">{$vo['uid']}</td> 26 <td>{$vo['username']}</td> 27 <td>{$vo['email']}</td> 28 <td>{$vo['regdate']|date='Y-m-d H:i',###}</td> 29 </tr> 30 </volist> 31 </table>
該方法是和 select() 用法相似的一個方法,不一樣之處 find() 查詢出來的始終只有一條數據,即系統自動加上了 LIMIT 1 限制。
1 //當確認查詢的數據記錄只能是一條記錄時,建議使用 find() 方法查詢,如用戶登陸帳號檢測: 2 3 public function chekUser(){ 4 header("Content-Type:text/html; charset=utf-8"); 5 $Dao = M("User"); 6 7 // 構造查詢條件 8 $condition['username'] = 'Admin'; 9 $condition['password'] = MD5('123456'); 10 // 查詢數據 11 $list = $Dao->where($condition)->find(); 12 } 13 14 //與 select() 的另外一個不一樣之處在於,find() 返回的是一個一維數組,能夠在模板裏直接輸出數組單元的值而無需使用 volist 等標籤循環輸出: 15 16 <p>{$list['username']}</p>
是一個魔術方法,能夠根據某個字段名稱動態獲得對應的一條數據記錄。
1 public function chekUser(){ 2 header("Content-Type:text/html; charset=utf-8"); 3 $Dao = M("User"); 4 5 // 查詢數據 6 $user = $Dao->getByUsername('Admin'); 7 }
等同於SQL語句:
SELECT * FROM user WHERE username = 'Admin' LIMIT 1
提示:
請注意,在getBy以後緊跟着的字段名稱,首字母必須大寫。對於如 user_name 這樣的字段名稱,以駝峯法自動識別下劃線,即:
$user = $Dao->getByUserName('Admin');實際使用中能夠靈活根據查詢的字段名來定義 getBy 放入,如:getByEmail、getByTitle、getById 等。
是專門用於獲取某個字段的值或者多個字段的索引數組。該方法與 field方法 不一樣,是一個獨立的方法而不須要再使用 find 或者 select 。
參數 | 說明 |
fields | 必須,須要查詢的字段名稱,能夠是一個或多個字段 |
condition | 可選,查詢條件,能夠是字符或數組,參考 select 方法查詢條件 |
spea | 可選,多個字段數據生成關聯數組時,數據間隔符號,默認爲空格 |
1 public function select(){ 2 header("Content-Type:text/html; charset=utf-8"); 3 $Dao = M("User"); 4 $list = $Dao->getField('uid,username,email','uid < 4','|'); 5 dump($list); 6 } 7 8 //dump 打印出的結果是: 9 10 array(3) { 11 [1] => string(21) "admin|admin@5idev.com" 12 [2] => string(23) "小明|xiaoming@163.com" 13 [3] => string(19) "Jack|jack@gmail.com" 14 }
取得符合查詢條件的區間記錄
1 public function read(){ 2 $Dao = M('User'); 3 $condition['uid'] = array(array('gt',1),array('lt',5));//(uid > 1) AND (uid < 5)
3.1 $condition['uid'] = array(array('gt',3),array('lt',10), 'or');//(uid < 1) OR (uid > 10)
3.2 $condition['username'] = array(array('like','%a%'), array('like','%b%'), 'Admin','or');//(username LIKE '%a%') OR (username LIKE '%b%') OR (username = 'Admin') 4 $list = $Dao->where($condition)->select(); 5 if($list){ 6 $this->assign('list', $list); 7 $this->display(); 8 } else { 9 $this->error($Dao->getError()); 10 } 11 }
等同於SQL語句:
SELECT * FROM user WHERE ( (uid > 1) AND (uid < 5) );
儘管ThinkPHP內置了大量的數據操做方法,但ThinkPHP仍保留了對原生SQL查詢的支持,以便知足複雜查詢的須要和一些特殊的數據操做。SQL查詢的返回值是直接返回DB類的查詢結果,沒有作任何的處理,並且能夠支持查詢緩存。
原生SQL查詢有 query() 和 execute() 兩個方法:
1 //query() 方法是用於 SQL 查詢操做,和select()方法同樣返回符合查詢條件的數據集。 2 //對於 query() 方法返回的數據集,跟 select() 同樣,能夠在模板裏直接循環輸出。 3 public function read(){ 4 // 實例化一個空模型,沒有對應任何數據表 5 $Dao = M(); 6 //或者使用 $Dao = new Model(); 7 8 $list = $Dao->query("select * from user where uid<5"); 9 if($list){ 10 $this->assign('list', $list ); 11 $this->display(); 12 } else { 13 $this->error($Dao->getError()); 14 } 15 } 16 17 18 //execute() 方法用於更新和寫入數據的 SQL 操做(注:非查詢操做,無返回數據集),返回影響的記錄數。 19 20 public function read(){ 21 header("Content-Type:text/html; charset=utf-8"); 22 // 實例化一個空模型,沒有對應任何數據表 23 $Dao = M(); 24 //或者使用 $Dao = new Model(); 25 26 $num = $Dao->execute("update user set email = '12345@xxx.com' where uid=3"); 27 }
取得符合查詢條件的統計數據
方法用於統計數據行數。
1 public function read(){ 2 $Dao = M('User'); 3 // 獲取用戶數: 4 $userCount = $Dao->count(); 5 // 添加條件: 6 $userCount2 = $Dao->where('uid > 10')->count(); 7 8 $this->assign('userCount', $userCount); 9 $this->display(); 10 }//能夠在模板中直接輸出獲得的統計數據:共有用戶 {$userCount} 人。
兩個查詢語句實際執行的 SQL 爲:
1 SELECT COUNT(*) AS tp_count FROM user LIMIT 1 2 SELECT COUNT(*) AS tp_count FROM user WHERE uid > 10 LIMIT 1
方法用於統計某個字段最大數據。
1 //統計用戶最大積分例子:
2 $maxScore = $Dao->max('score');
實際執行的 SQL 爲:
SELECT MAX(score) AS tp_max FROM user LIMIT 1 ;
統計某個字段最小數據。
1 //獲取積分大於 0 的用戶的最小積分例子: 2 $minScore = $Dao->where('score>0')->min('score');
實際執行的 SQL 爲:
SELECT MIN(score) AS tp_min FROM user WHERE score>0 LIMIT 1;
統計某個字段平均數據。
1 //獲取用戶的平均積分例子: 2 $avgScore = $Dao->avg('score');
實際執行的 SQL 爲:
SELECT AVG(score) AS tp_avg FROM user LIMIT 1;
統計某個字段數據之和。
1 //統計積分排名前 10 名用戶的積分之和: 2 $sumScore = $Dao->order('score DESC')->limit('10')->sum('score');
實際執行的 SQL 爲:
SELECT SUM(score) AS tp_sum FROM user ORDER BY score DESC LIMIT 10;