使用Laravel怎么实现一个数据软删除功能

  介绍

这篇文章给大家介绍使用Laravel怎么实现一个数据软删除功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

软删除功能需要实现的功能有以下几点:

1。模型执行删除操作,只标记删除,不执行真正的数据删除

2。查询的时候自动过滤已经标记为删除的数据

3。可以设置是否查询已删除的数据,可以设置只查询已删除的数据

4。已删除数据可以恢复

<强>模型的软删除功能实现

照亮\数据库\雄辩\ Model 中删除方法源码:      public  function 删除()   {   ,if  (is_null ($ this→getKeyName ())), {   throw 才能;new 异常(& # 39;No  primary  key  defined 提醒模型# 39;公司);   ,}   ,if (!,这→美元存在),{   返回才能;   ,}   ,if  ($ this→fireModelEvent(& # 39;删除# 39;),===,false), {   return 才能;假;   ,}   ,$ this→touchOwners ();   ,$ this→performDeleteOnModel ();   ,$ this→fireModelEvent(& # 39;删除# 39;,,假);   ,return 真实;   }   protected  function  performDeleteOnModel ()   {   ,$ this→setKeysForSaveQuery ($ this→newModelQuery ())   ,→删除();   ,$ this→exists =,假;   }

因为在子类中使用了,SoftDeletes特征,所以,<代码>,SoftDeletes 的<代码>,performDeleteOnModel 方法会覆盖父类的方法,最终通过,<代码>,runSoftDelete 方法更新删除标记。

protected  function  performDeleteOnModel ()   {   ,if  ($ this→forceDeleting), {   这个美元才能→exists =,假;   return 才能;这→美元newModelQuery ()→(   ,,,这个→美元getKeyName (), $ this→getKey ()   )→才能forceDelete ();   ,}   ,return 这→美元runSoftDelete ();   }      protected  function  runSoftDelete ()   {   美元,美元query =,这→newModelQuery ()   ,,,,,,,($ this→getKeyName (), $ this→getKey ());   美元,美元time =,这→freshTimestamp ();   美元,美元columns =,(这个→getDeletedAtColumn(),=祝辞,$ this→fromDateTime ($));   ,$ this→{$ this→getDeletedAtColumn()},=,美元的时间;   ,if  ($ this→timestamps ,,, !, is_null ($ this→getUpdatedAtColumn ())), {   这个美元才能→{$ this→getUpdatedAtColumn()},=,美元的时间;   美元才能列($ this→getUpdatedAtColumn ()],=, $ this→fromDateTime ($);   ,}   美元,美元查询→更新(列);   }

<强>模型查询过滤删除数据

Laravel中允许在模型中,<代码>静态:addGlobalScope 方法添加全局的,范围。这样就可以在查询条件中添加一个全局条件.Laravel中软删除数据的过滤也是使用这种方式实现的。

SoftDeletes特质中加入了,<代码>照亮\数据库\雄辩\ SoftDeletingScope 全局的,范围。并在,SoftDeletingScope中实现查询自动过滤被删除数据,指定查询已删除数据功能。

public  static  function  bootSoftDeletes ()   {   ,静态:addGlobalScope (new  SoftDeletingScope);   }

<>强远程关联数据的软删除处理

范围的作用只在于当前模型,以及关联模型操作上。如果是远程关联,则还需要额外的处理.Laravel远程关联关系通过,hasManyThrough实现。里面有两个地方涉及到软删除的查询。

protected  function  performJoin (Builder  query 美元;=,null)   {   美元,美元query =, query 吗?,$ this→查询;   美元,美元farKey =,这→getQualifiedFarKeyName ();   美元,查询→加入($ this→throughParent→可以获得的(),$ this→getQualifiedParentKeyName (), & # 39;=& # 39;,, farKey美元);   ,if  ($ this→throughParentSoftDeletes ()), {   美元才能查询→whereNull (   ,,这→美元throughParent→getQualifiedDeletedAtColumn ()   ,,);   ,}   }      public  function  throughParentSoftDeletes ()   {   ,return  in_array (SoftDeletes::类,,class_uses_recursive (   get_class才能($ this→throughParent)   ,));   }   public  function  getRelationExistenceQueryForSelfRelation (Builder 查询,美元,Builder  parentQuery美元,美元columns =, (& # 39; * & # 39;])   {   ,从查询→美元(美元)查询→getModel()→可以获得的()# 39;公司,as  & # 39;   hash 美元;才能=,$ this→getRelationCountHash ()   ,);   美元,查询→加入($ this→throughParent→可以获得的(),,   这个美元才能→getQualifiedParentKeyName(), & # 39;=& # 39;,,哈希公司美元# 39;强生# 39;。$ this→secondLocalKey   ,);   ,if  ($ this→throughParentSoftDeletes ()), {   美元才能查询→whereNull ($ this→throughParent→getQualifiedDeletedAtColumn ());   ,}   美元,查询→getModel()→可变的($散列);   ,return 查询→美元(美元列)→选择whereColumn (   parentQuery→美元才能getQuery()→从强生,强生的# 39;。查询→美元getModel ()→getKeyName (), & # 39;=& # 39;,, $ this→getQualifiedFirstKeyName ()   ,);   null

使用Laravel怎么实现一个数据软删除功能