delete方法

delete方法

1、功能:删除数据表中满足条件的记录

必须设置条件,否则该方法拒绝执行,以确保数据安全

2、源码:

系统中有二个delete方法,名称相同,功能不同

1. /thinkphp/library/think/db/Buider.php 中的delete方法

说明:该delete方法负责根据条件,生成删除记录的SQL语句字符串

2. /thinkphp/library/think/db/Query.php中的delete方法

说明:该delete方法根据主键或条件删除记录

3、参数与返回值

  • 我们先说返回值:
  1. 定义在Builder.php类中的delete方法,返回一个SQL删除语句的字符串,如:
DELETE FROM tp5_staff WHERE id = 1010 ;
  1. 定义在Query.php类中的delete方法,返回受影响记录数,即删除记录数量(整数)。


  • 参数说明:


    1. 如delete方法前设置了where方法,则delete参数无效
    2. 即设置了where方法,又设置了delete参数,刚where优先级高于delete参数
参数类型 说明
数组 / $data [ ] 设置删除条件,仅支持数组查询器,不支持字符串
布尔 / true 强制清空数据表

4、语法:

  1. 条件写在参数中
Db::table( 表名 ) -> delete( 条件表达式 );
  1. 清空数据表
Db::table( 表名 ) -> delete( true );
  1. 前置条件where方法
Db::table( 表名 ) -> where( 条件表达式 ) -> delete( );

最后的delete方法不应有任何参数,如果有,则where方法失效

5、实例演示

  • 先查看一下tp5_staff表中记录,将要删除记录进行标注:

任务:删除id=1022的记录

  1. 演示给delete方法传参方式删除
  2. 演示where方法设置条件进行删除

1. 给delete方法传参:

  • Index.php 控制器源代码:
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文件如下:
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 控制器文件:

 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 代码如下:
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方法删除的数据可以恢复,但是操作之前,还是要仔细检查,确认数据无用再操作;

  1. delete方法不建议传入参数,条件全部采用where传入,便于用闭包构造高级查询。