介绍
这篇文章给大家介绍使用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怎么实现一个数据软删除功能