之前接觸的都是sql原生語句,thinkPHP做了封裝,不過適應起來還是挺快的。
記錄了幾個常用的例子,還有其他形式的,本文沒有記錄。
| 目錄 |
| 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 |
1、增
ThinkPHP 內置的 add 方法用於向數據表添加數據,相當於 SQL 中的 INSERT INTO 行為。
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語句:
INSERT INTO user(username,password,email,regdate) VALUES ('小王','e10adc3949ba59abbe56e057f20f883e','12345@163.com',1486974334);
2、刪
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;
3、改
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';
提示
為了保證數據庫的安全,避免出錯更新整個數據表,如果沒有任何更新條件,數據對象本身也不包含主鍵字段的話,save方法不會更新任何數據庫的記錄。
因此要使用 save() 方法更新數據,必須指定更新條件或者更新的數據中包含主鍵字段。
4、查
ThinkPHP 查詢數據主要提供以下幾類查詢:
1)select
是 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>
2)find
該方法是和 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>
3)getBy動態查詢
是一個魔術方法,可以根據某個字段名稱動態得到對應的一條數據記錄。
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 等。
4)getField
是專門用於獲取某個字段的值或者多個字段的索引數組。該方法與 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 }
5)區間查詢
取得符合查詢條件的區間記錄
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) );
6)原生SQL查詢
盡管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 }
7)統計查詢
取得符合查詢條件的統計數據
count()
方法用於統計數據行數。
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
max()
方法用於統計某個字段最大數據。
1 //統計用戶最大積分例子:
2 $maxScore = $Dao->max('score');
實際執行的 SQL 為:
SELECT MAX(score) AS tp_max FROM user LIMIT 1 ;
min()
統計某個字段最小數據。
1 //獲取積分大於 0 的用戶的最小積分例子: 2 $minScore = $Dao->where('score>0')->min('score');
實際執行的 SQL 為:
SELECT MIN(score) AS tp_min FROM user WHERE score>0 LIMIT 1;
avg()
統計某個字段平均數據。
1 //獲取用戶的平均積分例子: 2 $avgScore = $Dao->avg('score');
實際執行的 SQL 為:
SELECT AVG(score) AS tp_avg FROM user LIMIT 1;
sum()
統計某個字段數據之和。
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;
