您现在的位置是:首页 > thinkphp6教程thinkphp6教程
thinkphp6软删除 destroy与delete区别
上善若水2020-07-01 10:54:31【thinkphp6教程】 7485人已围观
简介thinkphp6软删除还是比较坑的,使用delete()无法删除触发模型事件,无法触发软删除,destroy与delete两者在使用上有有区别,来看看正确的使用软删除的操作,以及需要注意事项. 配置
thinkphp6软删除还是比较坑的,使用delete()无法删除触发模型事件,无法触发软删除,destroy与delete两者在使用上有有区别,来看看正确的使用软删除的操作,以及需要注意事项.
配置使用软删除
模型中添加delete_time
use SoftDelete;
protected $deleteTime = 'delete_time';
数据表添加字段:
使用注意事项
使用delete注意
$new = new News1();
$new->where('id',1)->delete();
$res=News1::where("id=1")->delete();
通过打查看输出的语句可以看到并没有执行删除语句.
CONNECT:[ UseTime:0.001012s ] mysql:host=127.0.0.1;port=3306;dbname=4vsy;charset=utf8
SHOW FULL COLUMNS FROM `news1` [ RunTime:0.001406s ]
需使用先查询在调用delete语句
$new = News1::find(2);
$res=$new->delete();
执行结果为boolean true
,程序返回了正常,查看打印的sql发现执行了更新语句.
CONNECT:[ UseTime:0.000861s ] mysql:host=127.0.0.1;port=3306;dbname=4vsy;charset=utf8
SHOW FULL COLUMNS FROM `news1` [ RunTime:0.000767s ]
SELECT * FROM `news1` WHERE ( `id` = 2 ) AND `news1`.`delete_time` IS NULL LIMIT 1 [ RunTime:0.000304s ]
UPDATE `news1` SET `delete_time` = 1593571095 , `update_time` = 1593571095 WHERE ( `id` = 2 ) AND `news1`.`delete_time` IS NULL [ RunTime:0.000292s ]
使用destroy注意
推荐使用destroy方法,destroy方法会触发模型事件
注意这种写法错误:$res=News1::where(“id”,”<”,”5”)->destroy();;,提示method not exist:think\db\Query->destroy
正确写法$new = News1::destroy(2);
$res=News1::destroy(function($query){
$query->where('id','<=',5);
});
打印sql可以看到是逐条删除的.以下为执行的sql的语句.
CONNECT:[ UseTime:0.000800s ] mysql:host=127.0.0.1;port=3306;dbname=4vsy;charset=utf8
SHOW FULL COLUMNS FROM `news1` [ RunTime:0.000675s ]
SELECT * FROM `news1` WHERE ( `id` = 2 ) AND `news1`.`delete_time` IS NULL [ RunTime:0.000348s ]
index:150 UPDATE `news1` SET `delete_time` = 1593571783 , `update_time` = 1593571783 WHERE ( `id` = 2 ) AND `news1`.`delete_time` IS NULL [ RunTime:0.000418s ]
SELECT * FROM `news1` WHERE ( `id` <= 5 ) AND `news1`.`delete_time` IS NULL [ RunTime:0.000457s ]
UPDATE `news1` SET `delete_time` = 1593571783 , `update_time` = 1593571783 WHERE ( `id` = 3 ) AND `news1`.`delete_time` IS NULL [ RunTime:0.000400s ]
UPDATE `news1` SET `delete_time` = 1593571783 , `update_time` = 1593571783 WHERE ( `id` = 4 ) AND `news1`.`delete_time` IS NULL [ RunTime:0.000379s ]
UPDATE `news1` SET `delete_time` = 1593571783 , `update_time` = 1593571783 WHERE ( `id` = 5 ) AND `news1`.`delete_time` IS NULL [ RunTime:0.000450s ]
整理不易,希望对大家有所帮助!以下内容为官方软删除详细介绍,大家参考参考!
软删除
在实际项目中,对数据频繁使用删除操作会导致性能问题,软删除的作用就是把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢复。
要使用软删除功能,需要引入SoftDelete trait,例如User模型按照下面的定义就可以使用软删除功能:
<?php
namespace app\model;
use think\Model;
use think\model\concern\SoftDelete;
class User extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
}
deleteTime属性用于定义你的软删除标记字段,ThinkPHP的软删除功能使用时间戳类型(数据表默认值为Null),用于记录数据的删除时间。
可以支持defaultSoftDelete属性来定义软删除字段的默认值,在此之前的版本,软删除字段的默认值必须为null。
<?php
namespace app\model;
use think\Model;
use think\model\concern\SoftDelete;
class User extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
protected $defaultSoftDelete = 0;
}
可以用类型转换指定软删除字段的类型,建议数据表的所有时间字段统一一种类型。
定义好模型后,我们就可以使用:
// 软删除
User::destroy(1);
// 真实删除
User::destroy(1,true);
$user = User::find(1);
// 软删除
$user->delete();
// 真实删除
$user->force()->delete();
默认情况下查询的数据不包含软删除数据,如果需要包含软删除的数据,可以使用下面的方式查询:
User::withTrashed()->find();
User::withTrashed()->select();
如果仅仅需要查询软删除的数据,可以使用:
User::onlyTrashed()->find();
User::onlyTrashed()->select();
恢复被软删除的数据
$user = User::onlyTrashed()->find(1);
$user->restore();
软删除的删除操作仅对模型的删除方法有效,如果直接使用数据库的删除方法则无效,例如下面的方式无效。
$user = new User;
$user->where('id',1)->delete();
Tags: ThinkPHP6
很赞哦! (45)
相关文章
随机图文
-
ThinkPHP6.0 只读字段
只读字段用来保护某些特殊的字段值不被更改,这个字段的值一旦写入,就无法更改。 要使用只读字段的功能,我们只需要在模型中定义readonly属性: -
精品笑话十五则,总有一则逗乐您
1、刚毕业的时候在一家电子厂打エ,同宿舍有一姐妹老喜欢吃别人的东西。只要是吃的东西放桌上,一转身准没了。有次我买了几个苹果,想想放着不安全,我每个苹果都咬了一口后出去。回来我发现……整颗苹果只剩下我咬的那一小块了…… 2、我侄女是幼儿园老师,她女儿归她教,别的孩子在幼儿园里哭找妈妈,小家伙倒好人家哭天喊地的找爸爸。 3、最近每天陪领导下乡,一个礼拜下来,晒的黑炭似的才回来。刚进家,6岁的儿子看 -
php技术提升心得与方法
现在的PHP市场虽然充斥了大量的的PHP开发人员,但这些人当中真正能称得上高手的却寥寥无几。很多公司虽然招聘了一些PHP开发人员,但是由于技术水平不高,导致公司的项目一直堆积。这不仅另公司无奈也让已经入职的PHP开发人员着急,他们也想要在PHP领域更近一步,但却苦于找不到提高自己的方法,下面我们的鸥仔收集了一些PHP大神的一些工作方式、习惯,让大家看看PHP大神们是如何工作,也希望这些方法能帮助到那些想要在PHP领域更近一步的人。 -
速卖通官方sdk composer扩展包安装
由于速卖通官方有给我们提供扩展包,但是没有提供直接composer安装,导致使用起来有些不方便,由于官方提供的扩展包没有命名空间概念,就使用classmap自动加载方式制作成扩展包,这样不需要额外做任