delete方法
1、功能:删除数据表中满足条件的记录必须设置条件,否则该方法拒绝执行,以确保数据安全
2、源码:系统中有二个delete方法,名称相同,功能不同
1. /thinkphp/library/think/db/Buider.php 中的delete方法
说明:该delete方法负责根据条件,生成删除记录的SQL语句字符串
2. /thinkphp/library/think/db/Query.php中的delete方法
说明:该delete方法根据主键或条件删除记录
3、参数与返回值我们先说返回值:定义在Builder.php类中的delete方法,返回一个SQL删除语句的字符串,如:DELETE FROM tp5_staff WHERE id = 1010 ;定义在Query.php类中的delete方法,返回受影响记录数,即删除记录数量(整数)。
参数说明:
如delete方法前设置了where方法,则delete参数无效
即设置了where方法,又设置了delete参数,刚where优先级高于delete参数参数类型说明数组 / $data [ ]设置删除条件,仅支持数组查询器,不支持字符串
布尔 / true强制清空数据表
4、语法:条件写在参数中Db::table( 表名 ) -> delete( 条件表达式 );清空数据表Db::table( 表名 ) -> delete( true );前置条件where方法Db::table( 表名 ) -> where( 条件表达式 ) -> delete( );最后的delete方法不应有任何参数,如果有,则where方法失效
5、实例演示先查看一下tp5_staff表中记录,将要删除记录进行标注:
任务:删除id=1022的记录演示给delete方法传参方式删除
演示where方法设置条件进行删除
1. 给delete方法传参:Index.php 控制器源代码:<?php
namespace app\index\controller;
use think\Db;
class Index {
public function index(){
// 字符串方式传入条件表达式
Db::table('tp5_staff')->delete('id=1022');
//查看该记录是否还在?
dump(Db::table('tp5_staff')->find(1022));
}
}运行结果如下:array(7) {
["id"] => int(1022)
["name"] => string(12) "司马道长"
["sex"] => int(1)
["age"] => int(39)
["salary"] => float(8540)
["dept"] => int(1)
["hiredate"] => string(10) "2010-11-20"
}仍然可以查询到id-1022的数据,证明删除失败!
我们Index.php控制器中delete参数做些修改// 字符串方式传入条件表达式
Db::table('tp5_staff')->delete('id',1022');仍然删除失败!
是不是不支持缩写呢?我们再次修改参数形式:// 字符串方式传入条件表达式
Db::table('tp5_staff')->delete('id','=',1022');
结果仍然删除失败
现在我们使出“洪荒之力”,直接上数组条件表达式:查询表达式下节课就会讲到,这里先做一了解
表达式 :( id,'=',1022) 等价于 ( [ 'id' => [ '=' , 1022 ] ] )经过修改后的:Index.php文件如下:<?php
namespace app\index\controller;
use think\Db;
class Index {
public function index(){
// 数组方式传入条件表达式
Db::table('tp5_staff')->delete(['id'=>['=',1022 ]]);
//查看该记录是否还在?
dump(Db::table('tp5_staff')->find(1022));
}
}运行结果:NULL //查询不到id =1022的记录,结果为NULL,表示删除成功啦!
下面再演示一下给delete传入true:为了演示直观,我们先复制一张与tp5_staff一样的表,还记得复制表的MySQL语句吗?忘记了,请查看一下前面的MySQL复习部分吧!CREATE TABLE tp5_temp5 AS SELECT * FROM `tp5_staff` ;查看 tp5_temp5表:
修改Index.php 控制器文件:<?php
namespace app\index\controller;
use think\Db;
class Index {
public function index() {
//传入true,清空当前数据表
Db::table('tp5_temp5') -> delete(true);
//查看是否清空?
dump( Db::table('tp5_temp5') -> select());
}
}运行结果:array(0) { //查询结果为空,说明清空成功,表中无任何记录
}再次查看数据表:
2. 下面演示一个where条件删除:这里用到了构造查询器的知识,我们还没有讲到,可先做了解,或者跳过
任务:删除id=1023到1026之间的4条记录为了测试where和delete删除条件优先级,我们将1023和1024记录删除条件放在where参数中,将1025、1026记录删除条件放在delete参数中,最终通过查询结果,确定究竟哪个条件生效了,也就知道哪个语句条件优先级高了~~Index.php 代码如下:<?php
namespace app\index\controller;
use think\Db;
class Index {
public function index() {
//创建一个查询器
$map1 = [];
$map2 = [];
$map3 = [];
$map1['id'] = ['in',[1023,1024]];
$map2['id'] = ['in',[1025,1026]];
$map3['id'] = ['between',[1023,1026]];
//传入true,清空当前数据表
Db::table('tp5_staff') ->where($map1) -> delete($map2);
//查看是否清空?
dump( Db::table('tp5_staff') ->where($map3) -> select());
}
}运行结果如:array(2) {
[0] => array(7) {
["id"] => int(1023)
["name"] => string(9) "段王爷"
["sex"] => int(0)
["age"] => int(90)
["salary"] => float(9560)
["dept"] => int(2)
["hiredate"] => string(10) "2015-12-31"
}
[1] => array(7) {
["id"] => int(1024)
["name"] => string(9) "鲁大师"
["sex"] => int(0)
["age"] => int(60)
["salary"] => float(300)
["dept"] => int(1)
["hiredate"] => string(10) "2012-09-09"
}
}分析:1023和1024记录仍在结果集,说明删除的是1025和1026,delete方法中的条件生效了! 从生成的SQL语句中也可以看到:[ SQL ] DELETE FROM `tp5_staff` WHERE `id` IN (1025,1026)
[ SQL ] SELECT * FROM `tp5_staff` WHERE `id` BETWEEN 1023 AND 1026结论:where条件与delete条件共存时,忽略where条件现在查看数据表:
6、总结:1.delete方法属于风险操作,必须带有条件。尽管delete方法删除的数据可以恢复,但是操作之前,还是要仔细检查,确认数据无用再操作;delete方法不建议传入参数,条件全部采用where传入,便于用闭包构造高级查询。