1、删除模型

1.1 使用delete删除模型

删除模型很简单,先获取要删除的模型实例,然后调用delete方法即可:

$post = Post::find(5);
if($post->delete()){echo '删除文章成功!';
}else{echo '删除文章失败!';
}

该方法返回truefalse

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、软删除及其相关实现

2.1 软删除实现

上述删除方法都会将数据表记录从数据库删除,此外Eloquent模型还支持软删除。

所谓软删除指的是数据表记录并未真的从数据库删除,而是将表记录的标识状态标记为软删除,这样在查询的时候就可以加以过滤,让对应表记录看上去是被”删除“了。Laravel中使用了一个日期字段作为标识状态,这个日期字段可以自定义,这里我们使用deleted_at,如果对应模型被软删除,则deleted_at字段的值为删除时间,否则该值为空。

要让Eloquent模型支持软删除,还要做一些设置。首先在模型类中要使用SoftDeletestrait,该trait为软删除提供一系列相关方法,具体可参考源码Illuminate\Database\Eloquent\SoftDeletes,此外还要设置$date属性数组,将deleted_at置于其中:

<?phpnamespace 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文件如下:

<?phpuse 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();
执行之后页面显示如下:id为6的文章又出现在了查询结果中。有时候我们只想要查看被软删除的模型,这也有招,通过SoftDeletes上的onlyTrashed方法即可:
$posts = Post::onlyTrashed()->get();
dd($posts);
执行后页面显示结果如下:

2.3 软删除恢复

有时候我们需要恢复被软删除的模型,可以使用SoftDeletes提供的restore方法:恢复单个模型
$post = Post::find(6);
$post->restore();
如果获取不到id也可用一下方法

恢复多个模型
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的表记录已经被删除,不复存在:
$post = Post::onlyTrashed()->find(6);
$post->restore();

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

  1. php软删除代码,PHP laeavel软删除以及软删除还原 易错点

    PHP laeavel软删除以及软删除还原 易错点 PHP laeavel软删除以及软删除还原 易错点 首先 数据库字段添加deleted_at字段 然后在模型层中引入 SoftDeletes类 并引 ...

  2. Laravel 5.1 文档攻略——Laravel Eloquent ORM最强大也是最难理解的部分:数据关系...

    简介 其实大家都知道,数据表之间都是可以关联的,Eloquent ORM是数据模型操作代替表操作,那么表的关联查询,在Eloquent这里也就是模型间的关联查询,这就是本章的主要内容: Eloquen ...

  3. 深入理解 Laravel Eloquent(三)——模型间关系(关联)

    Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database A ...

  4. 使用Laravel Eloquent ORM 时如何查询表中指定的字段

    我们在使用Laravel ORM的Model方法find, get, first方法获取数据对象时返回的数据对象的attributes属性数组里会包含数据表中所有的字段对应的键值关系, 那么如何在OR ...

  5. 使用Laravel Eloquent ORM 时如何查询表中指定的字段 1

    我们在使用Laravel ORM的Model方法find, get, first方法获取数据对象时返回的数据对象的attributes属性数组里会包含数据表中所有的字段对应的键值关系, 那么如何在OR ...

  6. laravel7 学习(19)批量删除,软删除

    下载 或composer安装 安装laravel-ide-helper composer require barryvdh/laravel-ide-helperphp artisan ide-help ...

  7. 使用 Eloquent ORM 使用 with 模型关联查询,如何处理select不同模型的字段(字段名可能相同)

    遇到一个问题,就是articles和article_comments两个数据模型 现在要查出来某个用户的评论列表(列表包含 评论内容article_comments.content.评论时间artic ...

  8. 1+X web中级 Laravel学习笔记——Eloquent ORM查询、更新、删除、新增

    Eloquent ORM简介 larave1所自带的Eloquent oRM是一个非常优美简洁的ActiveRecord实现,用来实现数据库的操作他的每个数据的表都有对应的模型(model)用于数据表 ...

  9. Laravel Lumen之Eloquent ORM使用速查-基础部分

    使用Eloquent ['eləkwənt] 时,数据库查询构造器的方法对模型类也是也用的,使用上只是省略了DB::table('表名')部分. 在模型中使用protected成员变量$table指定 ...

最新文章

  1. 真·无监督!延世大学提出图像到图像无监督模型,实验结果超SOTA
  2. 疯狂ios之疯狂打飞机游戏(3)
  3. 查询出来时间不对_2020年一级、二级建造师执业资格考试成绩可查询!
  4. 对角矩阵和类下三角矩阵的频率和质量数据比较
  5. 标记寄存器---汇编学习笔记
  6. [转]一张图理解prototype、proto和constructor的三角关系
  7. Android开发--真机调试出现device offline提示
  8. Spring整合定时任务组件Quartz的简单使用
  9. 数据写入规则IBufferWriterT
  10. Python代码书写规范
  11. 工作总结,关于浏览器不兼容的问题。
  12. [python][project][爬虫] 时光网抓取信息
  13. iphone铃声制作
  14. 1520 - 骑士的金币(coin)
  15. 我的世界java18w50a_我的世界Minecraft Java版 18w21a 发布
  16. 红海云签约中国中医药出版社,开启出版行业人力资源数字化新篇章
  17. Oracle数据库注入-墨者学院(SQL手工注入漏洞测试(Oracle数据库))
  18. 马斯京根法matlab程序,(一)马斯京根流量演算法
  19. [RBP] RaspberryPi系列之附二:重设密码
  20. 查高考成绩服务器维护,各省高考成绩查询时间公布,但这个时段不建议查看,过来人吃亏过...

热门文章

  1. 异步上传到又拍云的实例教程
  2. CF #536div2E(dp)
  3. 人生苦短,我用Manjaro
  4. win版本caffe源码libcaffe研究
  5. Elasticsearch实战(五)---高级搜索 Match/Match_phrase/Term/Must/should 组合使用
  6. 高可用——可用性的度量
  7. 网络安全从业者必看!注册网络安全等级测评工程师考证解读
  8. NBA篮球可视化分析网站
  9. 02组_现代软件工程_第04次作业——利用4象限原理分析自身CanTool项目的构成
  10. 课设题解(2019.01.04)