ThinkPHP 數據的增刪改查

以前接觸的都是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 查詢數據主要提供如下幾類查詢: 

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; 
相關文章
相關標籤/搜索