ThinkPHP5模型实例详解 / delete实例删除

delete实例删除

模型实例删除:delete( )

1. 功能:将当前数据对象软删除;

该方法属于SoftDelete类,并不是Model类中的,因为这个类优先级高于Model类,所以当前模型调用delete方法时,实际上是被SoftDelete类的delete方法拦截,真正执行的是SoftDelete类中的delete方法,而并不是我们熟悉的Model类的delete方法,一定要注意!


2. 步骤:

  1. 获取模型实例:数据对象;
  2. 删除该对象,即模型实例。

3. 实例演示

一、准备工作

  1. 给当前表添加delete_time字段

默认值为NULL,不设置也会自动为NULL,字段类型不可以是TIMESTAMP,因为这个类型的默认值由系统设置,适合于更新字段时间字段。

  • 添加字段SQL语句如下:
ALTER TABLE tp5_staff ADD delete_time DATETIME DEFAULT NULL;
  • 现在表中情况:

提示:如果某记录被软删除,则delete_time字段就会有值:'删除时间';


  1. 修改模型文件 :Staff.php
<?php
namespace app\index\model;

use think\Model;
use traits\model\SoftDelete;  //导入SoftDelete构件类

class Staff extends Model
{
    //引入SoftDelete类
    use SoftDelete; 

    //设置自定义删除时间字段名称
    protected $deleteTime = 'delete_time';  
}

模型代码分析:

  1. protected $deleteTime = 'delete_time';: 该语句设置删除时间字段名称,如果是'delete_time',可以不设置。
  2. 软删除字段名默认是:delete_time,如果你的是del_time,必须要加上:protected $deleteTime = 'del_time';,不可省略。

准备工作结束,下面开始进入实例~~


二、实例演示:

  1. 控制器:Index.php
<?php
namespace app\index\controller;

use app\index\model\Staff;

class Index
{
    public function index()
    {    
        ///获取id=1002的模型实例,创建数据对象$data
        $data = Staff::get(1002);

        //删除当前数据对象
        $affected = $data->delete();

        //反馈执行结果
        echo $affected ? '成功的软删除了'.$affected.'条记录!' : '软删除失败~~';
    }
}
  • 运行结果:
成功的软删除了1条记录!
  • 我们更次查看一下数据表:

软删除记录的标志就是:delete_time字段不为NULL,而是删除时间。


下面再演示一下如何查看

  1. 正常查询:不显示已软删除的记录
  • 控制器代码:
<?php
namespace app\index\controller;

use app\index\model\Staff;

class Index
{
    public function index()
    {    
       //创建查询闭包函数
       $closure = function ($query){
            $query -> field('id,name,delete_time');
        };

       //执行查询
      $result = Staff::all($closure);

        foreach ($result as $data){
            dump($data->getData());
        }
    }
}
  • 查询结果如下:

不包括被软删除的数据

array(3) {
  ["id"] => int(1001)
  ["name"] => string(6) "郭靖"
  ["delete_time"] => NULL
}

array(3) {
  ["id"] => int(1005)
  ["name"] => string(9) "欧阳锋"
  ["delete_time"] => NULL
}

array(3) {
  ["id"] => int(1006)
  ["name"] => string(6) "杨康"
  ["delete_time"] => NULL
}

  1. 特殊查询:可以查看已被软删除掉的数据
  • 控制器代码:
<?php
namespace app\index\controller;

use app\index\model\Staff;

class Index
{
    public function index()
    {    
        //用SoftDelete类的withTrashed() 方法实现
       $result = Staff::withTrashed() 
              ->field('id,name,delete_time')   //设置查询条件
              -> select();     //输出结果集:对象数组

        //遍历对象数组
        foreach ($result as $data){

            //输出原始数据
            dump($data->getData());
        }
    }
}

这里为什么要用select方法而不是all方法,因为withTrashed() 返回的是数据库查询Query对象,这一点格外注意。当然,最后返回的仍然是对象数组,而不是二维数组,因为这里毕竟是模型Staff调用,而不是Db调用。

  • 查看结果:

包括已被软删除的数据

array(3) {
  ["id"] => int(1001)
  ["name"] => string(6) "郭靖"
  ["delete_time"] => NULL
}

array(3) {
  ["id"] => int(1002)
  ["name"] => string(6) "黄蓉"
  ["delete_time"] => string(19) "0000-00-00 00:00:00"
}

array(3) {
  ["id"] => int(1005)
  ["name"] => string(9) "欧阳锋"
  ["delete_time"] => NULL
}

array(3) {
  ["id"] => int(1006)
  ["name"] => string(6) "杨康"
  ["delete_time"] => NULL
}

4. 总结

这里的delete方法与Model类中的delete方法完全不同,一定要注意。这也是trait类实现PHP多继承的典型应用,课后,请将该实例上机做一遍。