laravel中软删除怎样实现,原理是什么
Admin 2022-06-16 群英技术资讯 661 次浏览
在laravel中,软删除指的是数据表记录并未真的从数据库中删除,而是将表记录的表示状态标记为软删除,这样在查询时就可以进行过滤,让对应表记录看上去像是被“删除”了。
本文操作环境:Windows10系统、Laravel6版、Dell G3电脑。
1、删除模型
1.1 使用delete删除模型
删除模型很简单,先获取要删除的模型实例,然后调用delete
方法即可:
$post = Post::find(5); if($post->delete()){ echo '删除文章成功!'; }else{ echo '删除文章失败!'; }
该方法返回true
或false
。
1.2 使用destroy删除模型
当然如果已知要删除的模型id的话,可以用更简单的方法destroy
直接删除:
$deleted = Post::destroy(5);
你也可以一次传入多个模型id删除多个模型:
$deleted = Post::destroy([1,2,3,4,5]);
调用destroy
方法返回被删除的记录数。
1.3 使用查询构建器删除模型
既然前面提到Eloquent模型本身就是查询构建器,也可以使用查询构建器风格删除模型,比如我们要删除所有浏览数为0的文章,可以使用如下方式:
$deleted = Models\Post::where('views', 0)->delete();
返回结果为被删除的文章数。
2.1 软删除实现
上述删除方法都会将数据表记录从数据库删除,此外Eloquent模型还支持软删除。
所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at
,如果对应模型被软删除,则deleted_at
字段的值为删除时间,否则该值为空。
要让Eloquent模型支持软删除,还要做一些设置。首先在模型类中要使用SoftDeletes
trait,该trait为软删除提供一系列相关方法,具体可参考源码Illuminate\Database\Eloquent\SoftDeletes
,此外还要设置$date
属性数组,将deleted_at
置于其中:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use SoftDeletes; //设置表名 public $table = 'posts'; //设置主键 public $primaryKey = 'id'; //设置日期时间格式 public $dateFormat = 'U'; protected $guarded = ['id','views','user_id','updated_at','created_at']; protected $dates = ['delete_at']; }
然后对应的数据库posts
中添加deleted_at
列,我们使用迁移来实现,先执行Artisan命令:
php artisan make:migration alter_posts_deleted_at --table=posts
然后编辑生成的PHP文件如下:
<?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AlterPostsDeletedAt extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('posts', function (Blueprint $table) { $table->softDeletes(); }); } ...//其它方法 }
然后运行:
php artisan migrate
这样posts
中就有了deleted_at
列。接下来,我们在控制器中编写测试代码:
$post = Post::find(6); $post->delete(); if($post->trashed()){ echo '软删除成功!'; dd($post); }else{ echo '软删除失败!'; }
在浏览器中访问http://laravel.app:8000/test
,页面输出如下:
当我们再次通过下面这段代码获取所有文章:
$posts = Post::all(); dd($posts);
已经看不到id为6的文章的身影了。
2.2 查询结果包含软删除模型
那如果想要在查询结果中包含软删除的记录呢?可以使用SoftDeletes
trait上的withTrashed
方法:
$posts = Post::withTrashed()->get(); dd($posts);
执行之后页面显示如下:
id为6的文章又出现在了查询结果中。有时候我们只想要查看被软删除的模型,这也有招,通过SoftDeletes
上的onlyTrashed
方法即可:
$posts = Post::onlyTrashed()->get(); dd($posts);
执行后页面显示结果如下:
2.3 软删除恢复
有时候我们需要恢复被软删除的模型,可以使用SoftDeletes
提供的restore
方法:
恢复单个模型
$post = Post::find(6); $post->restore();
恢复多个模型
Post::withTrashed()->where('id','>',1)->restore();
恢复所有模型
Post::withTrashed()->restore();
恢复关联查询模型
$post = Post::find(6); $post->history()->restore();
2.4 强制删除
如果模型配置了软删除但我们确实要删除改模型对应数据库表记录,则可以使用SoftDeletes
提供的forceDelete
方法:
$post = Post::find(6); $post->forceDelete();
查看数据表可以发现id=6的表记录已经被删除,不复存在:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
(PHP5>=5.3.0)goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP中的 goto...
swoole的on有Server->on,它注册Server的事件回调函数。格式为:bool Server->on(string $event, mixed $callback);。
这篇文章主要介绍PHP解决中文乱码的方法,问题以及解决步骤如下,如果大家也有以下情况可以参考看看,接下来小编带着大家一起了解一下。
请写出echo、print_r、print、var_dump、die之间的区别 echo 只能输出字符串等单一数据不能输出数据类型不能输出数组等多种数据 print() 只能输出字符串等单一数据不能输出数据类型不能输出数组等多种数据有返回值true/false print_r()既能输出字符串等单一数据又能输出数组等多种数据但是不能输出数据类型var_dump
这篇文章主要介绍了Laravel框架实现的rbac权限管理操作,结合实例形式分析了Laravel框架权限控制rbac相关数据库创建、读写及权限判断等操作技巧,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008