destroy 静态软删除
静态软删除 destroy
功能
软删除符合条件的数据表记录
该方法与delete可以实现同样的功能 但调用方式不一样
因为这是一个静态方法 不需要模型对象 直接用模型类静态调用
源码位置
/thinkphp/library/traits/model/SoftDelete.php
public static function destroy($data, $force = false){
//实例化当前调用该方法的模型类:Staff.php//static():可以理解为静态方法中的$this$model = new static(); // 等价于: new Staff();//获取数据库查询对象,db()方法不在SoftDelete类中 这是调用Model类方法实现的$query = $model->db();//判断参数是否是数组 并且还是得关联数组if (is_array($data) && key($data) !== 0) {//设置查询条件,保存在Query对象的$options[]属性中$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; //计数器清零($count存放受影响的记录数量)if ($resultSet) { //如果结果集存在foreach ($resultSet as $data) { //遍历该结果集$result = $data->delete($force); //逐条删除数据$count += $result; //计数器累加}
}return $count; //返回删除记录的数量}
特别注意
$result = $data->delete($force);
中的delete($force),就是定义在SoftDelete.php类中的 delete 方法(软删除当前实例对象),并非数据库Query类中的delete方法
参数与返回值
序号 参数 说明
1 $key / 主键 删除单条记录,与delete方法类似
2 $array / 主键列表 删除多条记录,主键列表放在数组中
3 $where / 条件表达式 支持所有的查询表达式
3 $closure / 闭包函数 闭包函数中仅支持使用where方法
返回值:软删除的记录数量。
实例演示
table
id name sex age salary dept hiredate create_time update_time delete_time
1 国境 1 20 2000 1
2 黄蓉 0 66 9000 1
5
6
创建自定义模型类
Staff.php
<?php
namespace appindexmodel;
use thinkModel;
use traitsmodeloftDelete;
class Staff extends Model{//引入SoftDelete类
use SoftDelete;
}
Staff.php 类仅一条语句就可以了
use SoftDelete;。
一、根据主键或主键列表软删除
该操作非常简单 与前面学习的过的Model类的delete完全一样。快速带过
任务1:软删除主键id = 1002 的记录关键语句:
delete(条件,false) 中的false可省略 但建议写上 以便与硬删除有明显区别。
Staff::destroy(1002,false);
任务2:软删除主键id = 1002,1003,1004 的记录关键语句:
主键列表 要写一个索引数组中
Staff::destroy([1002,1003,1004],false);
注意:每次执行完成 请重置delete_time 为下例做准备:
//将所有软删除数据手工恢复update tp5_staff set delete_time = null;
二、根据查询条件软删除数据
任务3: 软删除工资salary大于5000的员工:
查询条件以数组形式提供
控制器
Index.php
<?php
namespace appindexcontroller;
use appindexmodeltaff;
class Index{
public function index(){
//软删除salary > 5000的记录
$affected = Staff::destroy(['salary'=>['>',5000]],false);
echo $affected ? '成功软删除'.$affected.'条记录!' : '软删除失败'; //创建闭包查询函数
$closure = function ($query){ $query -> field('id,name,delete_time'); };//执行查询
$result = Staff::all($closure); //这里不用all() 用selectd()也一样//遍历结果对象数组
foreach ($result as $data){
dump($data->getData());
}
}
}
任务4
软删除表中年龄大于30 并且工资在4000到5000之间的记录
该任务用闭包函数来实现
表中数据
<?php
namespace appindexcontroller;
use appindexmodeltaff;
class Index{
public function index(){
//创建删除条件:闭包
$where = function ($query){ $query->where('age','>',30)->where('salary','between',[4000,5000]); };//软删除age>30 AND salary在4000到5000之间的记录
$affected = Staff::destroy($where,false);
echo $affected ? '成功软删除'.$affected.'条记录!' : '软删除失败'; //创建闭包查询函数
$closure = function ($query){ $query -> field('id,name,delete_time'); };//执行查询
$result = Staff::all($closure);//遍历结果对象数组foreach ($result as $data){
dump($data->getData());
}
}
}
运行结果如下:
成功软删除1条记录!
array(3) {
["id"] => int(1001)
["name"] => string(6) "郭靖"
["delete_time"] => NULL}array(3) {
["id"] => int(1002)
["name"] => string(6) "黄蓉"
["delete_time"] => NULL}array(3) {
destroy方法内部还是调用本类的delete方法执行的
在完成任务的前提下 推荐首选静态方法 静态方法运行效率远高于普通方法
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题