## 删除记录:destroy( ) #### 1. 功能:根据条件从数据表中删除数据。 >[info] ThinkPHP5 推荐使用这个方法删除数据。 **** #### 2. 源码:/thinkphp/library/think/Model.php >[info] 源码本身并无注释,下面代码注释为本人所加,以便于读者学习。 ~~~~ /** * 删除记录 * @access public * @param mixed $data 主键列表 支持闭包查询条件 * @return integer 成功删除的记录数 */ public static function destroy($data) { //很多静态方法中都能看到这个语句:实例化调用此方法的类 $model = new static(); $query = $model->db(); //获取数据库连接实例 //如果参数为数组并且是关联数组(元素键名不为0) if (is_array($data) && key($data) !== 0) { //将数组做为条件表达式 $query->where($data); $data = null; //清空本次查询条件 } elseif ($data instanceof \Closure) { // 如果不是数组,则视为闭包查询 //自动调用自定义的闭包函数 call_user_func_array($data, [ & $query]); $data = null; //执行完毕清空条件 } elseif (is_null($data)) { //如以上都不满足,再判断参数是否为空 return 0; //参数为空,则返回0 :假 } //根据条件,获取结果集 $resultSet = $query->select($data); $count = 0; //计数器清零,为统计返回值做准备 if ($resultSet) { //如果结果集存在 foreach ($resultSet as $data) { //遍历该结果集 $result = $data->delete(); //逐条删除记录 $count += $result; //计数器自增 } } return $count; //返回删除的记录数量 } ~~~~ >[warning] 注意:这是一个静态方法,外部调用时要注意! **** #### 3. 参数与返回值 * 参数 |序号|参数|说明| |:---:|---|---| |1|$key / 主键| 删除单条记录,与delete方法类似| |2|$array / 主键列表|删除多条记录,主键列表放在数组中| |3|$where / 条件表达式| 支持所有的查询表达式| |3|$closure / 闭包函数| 闭包函数中仅支持使用where方法| * 返回值:成功删除的记录数量。 ***** #### 4. 实例演示: 一、根据主键删除记录: * 1. 删除单条记录 >[info] 主键直接写在参数中,有且仅有这一个参数 * 控制器:Index.php ~~~ <?php namespace app\index\controller; //导入自定义模型类 use app\index\model\Staff; class Index { public function index(){ //删除主键:1020的记录 $affected = Staff::destroy(1020); //根据返回值判断是否删除成功 echo $affected ? '删除成功!' : '删除失败~~'; } } ~~~ * 2. 删除多条记录 >[info] 多个主键以数组形式提供 * 控制器:Index.php ~~~ <?php namespace app\index\controller; //导入自定义模型类 use app\index\model\Staff; class Index { public function index(){ //删除主键:1020的记录 $affected = Staff::destroy([1020,1023,1030]); //根据返回值判断是否删除成功 echo $affected ? '删除成功!' : '删除失败~~'; } } ~~~ >[warning] 也可以将多主键放在字符串中:'1020,1023,1030'。推荐使用数组方法。 * * * * * 二、 根据条件删除 >[info] 查看该方法源码发现,删除条件应写在数组中。条件表达式有很多种,我们仅举一例说明,其它条件表达式是一样的,请学员自己动手测试~~ **任务:**删除主键id在1020到1030之间的记录 * 控制器:Index.php ~~~ <?php namespace app\index\controller; //导入自定义模型类 use app\index\model\Staff; class Index { public function index(){ //删除主键id在1020到1030之间的记录 $affected = Staff::destroy(['id'=>['between',[1028,1180]]]); //根据返回值判断是否删除成功 echo $affected ? '成功删除了'.$affected.'条记录!' : '删除失败~~'; } } ~~~ >[warning] 数组形式的条件表达式,要注意【括号】的正确嵌套! * * * * * 三、用闭包函数设置删除条件 >[info] 终于等到这个闭包上场了,在ThinkPHP5中,闭包几乎无处不在。 **任务:** 删除姓名name中有'阿'的记录 * 控制器:Index.php ~~~ <?php namespace app\index\controller; //导入自定义模型类 use app\index\model\Staff; class Index { public function index(){ //创建闭包函数 $closure = function ($query){ $query -> where(['name'=>['like','%阿%']]) }; //执行删除操作:条件由闭包函数提供 $affected = Staff::destroy($closure); //根据返回值判断是否删除成功 echo $affected ? '成功删除了'.$affected.'条记录!' : '删除失败~~'; } } ~~~ * * * * * #### 5. 总结 >[warning] 本章内容比较简单,执行结果都是可预测的,就不再给出了。 **下面再总结一下条件参数:** 1. 支持主键或主键列表[数组表示] 2. 支持查询条件表达式 3. 支持闭包函数