## 删除记录: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. 支持闭包函数
- 前言[随时更新]
- 开发环境
- 1.Mac环境
- 2.windows环境
- 模型对象
- 1.创建模型对象
- 2.模型初始化
- 数据对象
- 1.定义数据对象
- 2.创建数据对象
- 1.data方法
- 2.setAttr方法
- 3.__set方法
- 4.查询数据对象
- 1.getData方法
- 2.getAttr方法
- 3.__get方法
- OOP难点总结
- 1.get_class( )实例讲解
- 2.get_called_class( )实例讲解
- 3.__call( )实例讲解
- 3.__callStatic( )实例讲解
- 4.call_user_func_array函数[重点]
- 5.普通方法与静态方法
- 6.在Model源码中的应用
- 7.new static 延迟静态绑定
- PHP标准化规范
- 查询数据
- 1.获取单条:get静态方法
- 2.获取单条:对象查询
- 3.获取多条:all静态方法
- 4.获取多条:对象查询
- 5.获取字段值:value方法
- 6.获取列值:column方法
- 7.动态查询:getBy字段名
- 8.助手函数:model查询
- 9.加载器:Loader类查询
- 10.数据库与模型查询对比
- 新增数据
- 1.sava方法
- 2.savaAll方法
- 3.create静态方法
- 4.insert静态调用
- 更新数据
- 1.单条更新:save方法
- 2.批量更新:saveAll方法
- 3.静态更新:update方法
- 4.查询类Query直接更新
- 5. 闭包更新
- 删除数据
- 1.删除当前记录:delete
- 2.静态条件删除:destory
- 获取器
- 1.模型方法:set属性Attr
- 修改器
- 1.set属性Attr
- 时间戳
- 1.MySQL中日期类型复习
- 2.时间戳功能详解
- 软删除[重点]
- 1.traits详解[选学内容]
- 2.SoftDelet类源码分析
- 3. delete实例删除
- 4.destroy条件删除
- 5.restore恢复数据
- 类型转换
- 1. 规则设置
- 2. 实例演示
- 查询范围
- 1. 基本概念
- 2.实例演示