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的老王(laowang_php)

原文发表时间:2019-08-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券