laravel中软删除的原理是什么

发布时间 - 2022-02-22 00:00:00    点击率:
在laravel中,软删除指的是数据表记录并未真的从数据库中删除,而是将表记录的表示状态标记为软删除,这样在查询时就可以进行过滤,让对应表记录看上去像是被“删除”了。

本文操作环境:Windows10系统、Laravel6版、Dell G3电脑。

laravel中软删除的原理是什么

   1、删除模型

1.1 使用delete删除模型

删除模型很简单,先获取要删除的模型实例,然后调用delete方法即可:

$post = Post::find(5);
if($post->delete()){
    echo '删除文章成功!';
}else{
    echo '删除文章失败!';
}

该方法返回truefalse

1.2 使用destroy删除模型

当然如果已知要删除的模型id的话,可以用更简单的方法destroy直接删除:

$deleted = Post::destroy(5);

你也可以一次传入多个模型id删除多个模型:

$deleted = Post::destroy([1,2,3,4,5]);

调用destroy方法返回被删除的记录数。

1.3 使用查询构建器删除模型

既然前面提到Eloquent模型本身就是查询构建器,也可以使用查询构建器风格删除模型,比如我们要删除所有浏览数为0的文章,可以使用如下方式:

$deleted = Models\Post::where('views', 0)->delete();

返回结果为被删除的文章数。

2、软删除及其相关实现

2.1 软删除实现

上述删除方法都会将数据表记录从数据库删除,此外Eloquent模型还支持软删除。

所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。

要让Eloquent模型支持软删除,还要做一些设置。首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,具体可参考源码Illuminate\Database\Eloquent\SoftDeletes,此外还要设置$date属性数组,将deleted_at置于其中:

然后对应的数据库posts中添加deleted_at列,我们使用迁移来实现,先执行Artisan命令:

php artisan make:migration alter_posts_deleted_at --table=posts

然后编辑生成的PHP文件如下:

softDeletes();
        });
    }

    ...//其它方法
}

然后运行:

php artisan migrate

这样posts中就有了deleted_at列。接下来,我们在控制器中编写测试代码:

$post = Post::find(6);
$post->delete();
if($post->trashed()){
    echo '软删除成功!';
    dd($post);
}else{
    echo '软删除失败!';
}

在浏览器中访问http://laravel.app:8000/test,页面输出如下:

当我们再次通过下面这段代码获取所有文章:

$posts = Post::all();
dd($posts);

已经看不到id为6的文章的身影了。

2.2 查询结果包含软删除模型

那如果想要在查询结果中包含软删除的记录呢?可以使用SoftDeletes trait上的withTrashed方法:

$posts = Post::withTrashed()->get();
dd($posts);

执行之后页面显示如下:

id为6的文章又出现在了查询结果中。有时候我们只想要查看被软删除的模型,这也有招,通过SoftDeletes上的onlyTrashed方法即可:

$posts = Post::onlyTrashed()->get();
dd($posts);

执行后页面显示结果如下:

2.3 软删除恢复

有时候我们需要恢复被软删除的模型,可以使用SoftDeletes提供的restore方法:

恢复单个模型

$post = Post::find(6);
$post->restore();

恢复多个模型

Post::withTrashed()->where('id','>',1)->restore();

恢复所有模型

Post::withTrashed()->restore();

恢复关联查询模型

$post = Post::find(6);
$post->history()->restore();

2.4 强制删除

如果模型配置了软删除但我们确实要删除改模型对应数据库表记录,则可以使用SoftDeletes提供的forceDelete方法:

$post = Post::find(6);
$post->forceDelete();

查看数据表可以发现id=6的表记录已经被删除,不复存在:

【相关推荐:laravel视频教程】


# laravel  # 可以使用  # 多个  # 查询结果  # 指的是  # 值为  # 器中  # 出现在  # 可以用  # 这段  # 这也 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么连接多个数据库_Laravel多数据库连接配置  浅析上传头像示例及其注意事项  济南网站建设制作公司,室内设计网站一般都有哪些功能?  JavaScript如何实现继承_有哪些常用方法  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何在宝塔面板中修改默认建站目录?  Linux系统命令中tree命令详解  Laravel如何实现数据库事务?(DB Facade示例)  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  香港服务器租用费用高吗?如何避免常见误区?  php json中文编码为null的解决办法  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  PythonWeb开发入门教程_Flask快速构建Web应用  高端网站建设与定制开发一站式解决方案 中企动力  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  智能起名网站制作软件有哪些,制作logo的软件?  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  如何用低价快速搭建高质量网站?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  javascript基本数据类型及类型检测常用方法小结  如何用花生壳三步快速搭建专属网站?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  ,网页ppt怎么弄成自己的ppt?  高防服务器租用首荐平台,企业级优惠套餐快速部署  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Angular 表单中正确绑定输入值以确保提交与验证正常工作  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  青岛网站建设如何选择本地服务器?  Python面向对象测试方法_mock解析【教程】  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  java中使用zxing批量生成二维码立牌  Laravel如何配置任务调度?(Cron Job示例)  网站建设整体流程解析,建站其实很容易!  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel如何实现事件和监听器?(Event & Listener实战)  node.js报错:Cannot find module 'ejs'的解决办法  微信小程序 配置文件详细介绍  如何快速搭建二级域名独立网站?  如何将凡科建站内容保存为本地文件?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程