前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 软删除存在的问题

Laravel 软删除存在的问题

作者头像
写PHP的老王
发布2019-08-23 23:44:29
2.2K0
发布2019-08-23 23:44:29
举报
文章被收录于专栏:写PHP的老王写PHP的老王

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

代码语言:javascript
复制
//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中间表的问题是无解的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 写PHP的老王 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档