应用 Laravel 的软删除你需要注意的几点

Laravel 软删除存在的问题

1、软删除使用的标记类型是时间类型,通过is null条件查询,删除标记取值不支持定义

//Illuminate\Database\Eloquent\SoftDeletingScope

public function apply(Builder $builder, Model $model)
{
    $builder->whereNull($model->getQualifiedDeletedAtColumn());
}

3、软删除trait使用之后,不会对字段是否存在进行校验。对应已经存在的表,有些表存在软删除,有些表不存在软删除字段,如果要应用软删除,只能在需要应用的model中一个个添加trait

如果重写Illuminate\Database\Eloquent\SoftDeletestrait,如果类常量DELETED_AT为null,则不执行相应的软删除操作

4、join操作,只会在对当前模型添加软删除查询条件

5、在belonsToMany关联关系中,如果关联表,中间表,被关联表都有软删除字段,查询关联关系,不会对中间表应用软删除条件

belonsToMany中的中间表是传入的表名参数,天然没办法获取中间表是否需要应用软删除。被关联表是一个类对象,如果应用了软删除,则会自动附加上软删除条件

6、在hasManyThrough关联关系中,如果关联表,中间表,被关联表都有软删除字段,查询关联关系,会对中间表应用删除条件。但是,如果要查询包含已删除的关联关系,中间表的删除标记条件不会去除。

hasManyThrough中,中间表是通过中间对象传入,可以获取到中间表是否应用软删除。但是中间表的软删除不是通过scope实现的,关联关系对象在创建的时候就已经把中间表的软删除条件附加上去了,因此,即使指定了withTrashed,也会有中间表的软删除查询条件。

如果要修改,也可以,通过scope的方式附加软删除条件,这样就能保证软删除的查询条件是在真正查询的时候才附加上去。

从上面可以看出,Laravel的软删除,在关联关系中会造成一些查询上条件的歧义,非常容易产生bug.而且,belongsToMany中间表的问题是无解的。

转载自 公众号【写 PHP 的老王】

本作品采用《CC 协议》,转载必须注明作者和本文链接
写PHP的老王
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

软删除后,唯一验证也是查不到的

4年前 评论
不懂就学 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!