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 数据的增删改查的主要内容,如果未能解决你的问题,请参考以下文章