首页 > 代码库 > ThinkPHP 数据的增删改查

ThinkPHP 数据的增删改查

之前接触的都是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; 

 

ThinkPHP 数据的增删改查