laravel框架自带的字段为deleted_at, 但是我们现在的要求是改成is_delete 0=未删除,1=删除
这样问题就来了。deleted_at为时间戳格式。而我们的is_delete,直接use SoftDeletes会报错。
这样我们就需要自定义软删除了
laravel框架自带的model是直接执行delete操作,但是可以通过简单的复制代码把它设置为软删除,需要做到以下2点:

1)设置查询作用域

参考文档:https://docs.golaravel.com/docs/5.6/eloquent/#query-scopes

创建 SoftDeletingScope 类文件

<?phpnamespace App\ApiServices\Models\Utils;use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;class SoftDeletingScope implements Scope
{/*** 要添加到构建器的所有扩展。** @var string[]*/protected $extensions = ['Restore', 'WithTrashed', 'WithoutTrashed', 'OnlyTrashed'];/*** 将范围应用于给定的 Eloquent 查询构建器。** @param  \Illuminate\Database\Eloquent\Builder  $builder* @param  \Illuminate\Database\Eloquent\Model  $model* @return void*/public function apply(Builder $builder, Model $model){$builder->where('is_delete', '=', 0);}/*** 使用所需的功能扩展查询构建器。** @param  \Illuminate\Database\Eloquent\Builder  $builder* @return void*/public function extend(Builder $builder){foreach ($this->extensions as $extension) {$this->{"add{$extension}"}($builder);}$builder->onDelete(function (Builder $builder) {$column = $this->getDeletedAtColumn($builder);return $builder->update([$column => 1,]);});}/*** 获取构建器的“删除于”列。** @param  \Illuminate\Database\Eloquent\Builder  $builder* @return string*/protected function getDeletedAtColumn(Builder $builder){if (count((array) $builder->getQuery()->joins) > 0) {return $builder->getModel()->getQualifiedDeletedAtColumn();}return $builder->getModel()->getDeletedAtColumn();}/*** 将恢复扩展添加到构建器。** @param  \Illuminate\Database\Eloquent\Builder  $builder* @return void*/protected function addRestore(Builder $builder){$builder->macro('restore', function (Builder $builder) {$builder->withTrashed();return $builder->update([$builder->getModel()->getDeletedAtColumn() => 0]);});}/*** 将 with-trashed 扩展添加到构建器。** @param  \Illuminate\Database\Eloquent\Builder  $builder* @return void*/protected function addWithTrashed(Builder $builder){$builder->macro('withTrashed', function (Builder $builder, $withTrashed = true) {if (! $withTrashed) {return $builder->withoutTrashed();}return $builder->withoutGlobalScope($this);});}/*** 将没有垃圾的扩展添加到构建器。** @param  \Illuminate\Database\Eloquent\Builder  $builder* @return void*/protected function addWithoutTrashed(Builder $builder){$builder->macro('withoutTrashed', function (Builder $builder) {$model = $builder->getModel();$builder->withoutGlobalScope($this)->whereNull($model->getQualifiedDeletedAtColumn());return $builder;});}/*** Add the only-trashed extension to the builder.** @param  \Illuminate\Database\Eloquent\Builder  $builder* @return void*/protected function addOnlyTrashed(Builder $builder){$builder->macro('onlyTrashed', function (Builder $builder) {$model = $builder->getModel();$builder->withoutGlobalScope($this)->whereNotNull($model->getQualifiedDeletedAtColumn());return $builder;});}
}

2)删除动作设置为更新(使用is_deleted=1标识为已删除)


<?phpnamespace App\ApiServices\Models\Utils;trait SoftDeletes
{/*** Indicates if the model is currently force deleting.** @var bool*/protected $forceDeleting = false;/*** Boot the soft deleting trait for a model.** @return void*/public static function bootSoftDeletes(){static::addGlobalScope(new SoftDeletingScope);}/*** 为实例初始化软删除特性。** @return void*/public function initializeSoftDeletes(){if (! isset($this->casts[$this->getDeletedAtColumn()])) {$this->casts[$this->getDeletedAtColumn()] = 'bool';}}/*** 对软删除模型强制执行硬删除。** @return bool|null*/public function forceDelete(){$this->forceDeleting = true;return tap($this->delete(), function ($deleted) {$this->forceDeleting = false;if ($deleted) {$this->fireModelEvent('forceDeleted', false);}});}/*** 对该模型实例执行实际的删除查询。** @return mixed*/protected function performDeleteOnModel(){if ($this->forceDeleting) {$this->exists = false;return $this->setKeysForSaveQuery($this->newModelQuery())->forceDelete();}return $this->runSoftDelete();}/*** 对该模型实例执行实际的删除查询。** @return void*/protected function runSoftDelete(){$query = $this->setKeysForSaveQuery($this->newModelQuery());$isDelete = 1;$columns = [$this->getDeletedAtColumn() => $isDelete];$this->{$this->getDeletedAtColumn()} = $isDelete;if ($this->timestamps && ! is_null($this->getUpdatedAtColumn())) {$this->{$this->getUpdatedAtColumn()} = time();$columns[$this->getUpdatedAtColumn()] = $this->fromDateTime(time());}$query->update($columns);$this->syncOriginalAttributes(array_keys($columns));$this->fireModelEvent('trashed', false);}/*** 恢复软删除的模型实例。** @return bool|null*/public function restore(){// If the restoring event does not return false, we will proceed with this// restore operation. Otherwise, we bail out so the developer will stop// the restore totally. We will clear the deleted timestamp and save.if ($this->fireModelEvent('restoring') === false) {return false;}$this->{$this->getDeletedAtColumn()} = null;// Once we have saved the model, we will fire the "restored" event so this// developer will do anything they need to after a restore operation is// totally finished. Then we will return the result of the save call.$this->exists = true;$result = $this->save();$this->fireModelEvent('restored', false);return $result;}/*** 确定模型实例是否已被软删除。** @return bool*/public function trashed(){return ! empty($this->{$this->getDeletedAtColumn()});}/*** Register a "restoring" model event callback with the dispatcher.** @param  \Closure|string  $callback* @return void*/public static function restoring($callback){static::registerModelEvent('restoring', $callback);}/*** 向调度程序注册“恢复的”模型事件回调。** @param  \Closure|string  $callback* @return void*/public static function restored($callback){static::registerModelEvent('restored', $callback);}/*** 向调度程序注册“forceDeleted”模型事件回调。** @param  \Closure|string  $callback* @return void*/public static function forceDeleted($callback){static::registerModelEvent('forceDeleted', $callback);}/*** 确定模型当前是否正在强制删除。** @return bool*/public function isForceDeleting(){return $this->forceDeleting;}/*** Get the name of the "deleted at" column.** @return string*/public function getDeletedAtColumn(){return 'is_delete';}/*** 获取完全限定的“删除于”列。** @return string*/public function getQualifiedDeletedAtColumn(){return $this->qualifyColumn($this->getDeletedAtColumn());}}

laravel自定义软删除相关推荐

  1. 数据库软删除php,应用 Laravel 的软删除你需要注意的几点

    Laravel 软删除存在的问题 1.软删除使用的标记类型是时间类型,通过is null条件查询,删除标记取值不支持定义 //Illuminate\Database\Eloquent\SoftDele ...

  2. Laravel实现软删除

    Laravel实现软删除 Laravel 的 Eloquent ORM 提供了一个漂亮.简洁的 ActiveRecord 实现来和数据库交互.每个数据库表都有一个对应的「模型」用来与该表交互.你可以通 ...

  3. lumen php命令,laravel and lumen 软删除操作

    知识都是有联系的,这绝对是真理.作为一名小白,看了一点官方文档,把我自己理解的软删除操作给大家讲讲.有些就是套用官方文档的话. 定义:什么是软删除呢,所谓软删除指的是数据表记录并未真的从数据库删除,而 ...

  4. Laravel Eloquent ORM 实例教程 —— 模型删除及软删除相关实现

    1.删除模型 1.1 使用delete删除模型 删除模型很简单,先获取要删除的模型实例,然后调用delete方法即可: $post = Post::find(5); if($post->dele ...

  5. 十九、PHP框架Laravel学习笔记——批量赋值和软删除

    一.批量赋值 上一节增删改中,新增中我们发现需要进行批量赋值的许可: 一般情况下,是为了防止提交过来的字段在部分场景中不需要或不能: 所以,我们需要通过黑白名单机制进行过滤掉必要的字段: //通过提交 ...

  6. laravel框架总结(九) -- 软删除

    当模型被软删除时,它们并不会真的从数据库中被移除.而是会在模型上设置一个 deleted_at 属性并将其添加到数据库.如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空. ...

  7. spring boot实现软删除

    本文中,我们只给了部分示例代码. 如果你需要完整的代码,请点击:https://github.com/mengyunzhi/springBootSampleCode/tree/master/softD ...

  8. Android 自定义软键盘实现 数字九宫格

    前言 最近项目在对接美团外卖功能 实现外面小哥凭取货码取货 对接完功能后 用户反馈 弹出的软键盘 很难输入 数字太小了 大概是下面这种显示方式 需求 组长说 要不搞一个自定义软键盘吧 数字搞大点 方便 ...

  9. android keyboard颜色,Android基于KeyboardView和Keyboard实现自定义软键盘 自定义键盘背景色...

    Android基于KeyboardView和Keyboard实现自定义软键盘 在一些特别的情况下我们需要去自定义键盘 例如: 银行app的密码输入之类的 笨方法就是直接使用布局写我们的自定义软键盘 但 ...

最新文章

  1. 博士发公众号文章也能评国奖?双一流高校新规引热议!
  2. 从零入门 Serverless | 一文详解 Serverless 技术选型
  3. linux apache fcgi,编译安装apache2.2对应的mod_proxy_fcgi.so模块步骤,因为使用apache--phpfpm 需要这个...
  4. 看完Andoird9.0 Pie的隐藏特性,我买了SSL证书
  5. matlab如何测两点的角度_【邢不行|量化小讲堂系列01-Python量化入门】如何快速上手使用Python进行金融数据分析...
  6. FlinkAPI_Environment_输入源_算子转化流程
  7. Go Web 编程--超详细的模板库应用指南
  8. 初分配和再分配图解_针织好看暖和的儿童帽子图解教程,宝妈们千万不要错过...
  9. Python+OpenCV图像处理之模糊操作
  10. innodb下的mvcc_Mysql事务隔离以及MVCC实现原理
  11. Gantt - attachEvent事件监听 - 多个参数事件(大于两个)
  12. usb网卡android驱动+win7,usb网卡万能驱动_手把手教你usb网卡驱动
  13. WEB应用之JSP+Servlet
  14. JS+html+css实现的一个小小的贪吃蛇游戏
  15. 东北大学——考研复试——计算机网络——2014年
  16. java 代码加壳,专家和您一同谈谈java加壳的问题[Java编程]
  17. matlab 求解高次方程,Matlab求解多元高次方程组
  18. TensorFlow 2.1.0 使用 TFRecord 转存与读取图片
  19. Kafka集群搭建过程(kafka2.5+eagle)
  20. macOS SwiftUI 教程之 06 绘图实现正弦波,通过调整频率和步进值来更新正弦波视图 (教程含源码)

热门文章

  1. InvalidateRect(转)
  2. 原来吴京拍的“巨齿鲨”不是传说,在马里亚纳?
  3. 大数据技术对于市场营销的作用
  4. 如何让你的回调更具Kotlin风味
  5. python爬虫实例之小说爬取器
  6. 英国CodaOctopus公司的Echoscope®实时3D声呐
  7. Salesforce 2023财年逆风增长,现金流达历史最高!
  8. Python3实例分享_经纬度转换为地区和地址
  9. [Mapbox GL]点的动画效果
  10. Linux下压力测试工具-stress