ThinkPHP 数据的增删改查

Posted Leo的夜空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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"] = "[email protected]";    
 9     $data["regdate"] = time();
10 
11     // 写入数据
12     $insertM = $Dao->add($data);
13 }

等同于SQL语句:

INSERT INTO user(username,password,email,regdate) VALUES (小王,e10adc3949ba59abbe56e057f20f883e,[email protected],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‘] = ‘[email protected];
 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=[email protected] 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|[email protected]"
12   [2] => string(23) "小明|[email protected]"
13   [3] => string(19) "Jack|[email protected]"
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 = ‘[email protected]‘ 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 数据的增删改查的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP 数据的增删改查

PHP ThinkPHP 非常好用的增删改查方法

Thinkphp5的安装及其常用的增删改查

ThinkPHP的增删改查!

thinkphp5的增删改查操作,DB和模型

thinkphp5的增删改查操作,DB和模型