首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Eloquent has()方法对软删除的行数进行计数

基础概念

Eloquent 是 Laravel 框架中的一个 ORM(对象关系映射)工具,它允许开发者通过面向对象的方式操作数据库。has() 方法是 Eloquent 中的一个查询作用域,用于检查模型关联是否存在。例如,如果你有一个 User 模型和一个 Post 模型,并且 User 模型和 Post 模型之间存在一对多的关系,你可以使用 has() 方法来检查某个用户是否有帖子。

软删除

软删除是一种处理数据删除的方式,它并不是真正地从数据库中删除数据,而是通过添加一个标记字段(如 deleted_at)来表示该记录已被删除。这种方式的好处是可以轻松地恢复被删除的数据。

问题描述

在使用 Eloquent 的 has() 方法时,如果涉及到软删除的记录,可能会遇到计数不准确的问题。这是因为默认情况下,has() 方法不会考虑软删除的记录。

原因

has() 方法默认情况下不会查询软删除的记录,因此如果关联的记录被软删除了,has() 方法会返回错误的结果。

解决方法

要解决这个问题,可以使用 withTrashed() 方法来包含软删除的记录。withTrashed() 方法可以应用于模型或查询构建器,以包含软删除的记录。

示例代码

假设我们有一个 User 模型和一个 Post 模型,并且 User 模型和 Post 模型之间存在一对多的关系。我们可以这样使用 has() 方法并包含软删除的记录:

代码语言:txt
复制
use App\Models\User;

// 检查某个用户是否有被软删除的帖子
$user = User::find(1);
$hasDeletedPosts = $user->has('posts.deleted')->withTrashed()->count() > 0;

// 或者直接在查询中使用 withTrashed()
$hasDeletedPosts = User::has('posts.deleted')->withTrashed()->count() > 0;

参考链接

应用场景

这种解决方案适用于任何需要检查软删除记录的场景,例如:

  1. 用户管理:检查某个用户是否有被软删除的帖子或评论。
  2. 数据恢复:在恢复被软删除的数据时,需要确认哪些记录已被软删除。
  3. 审计日志:在记录审计日志时,需要包含软删除的操作。

通过使用 withTrashed() 方法,可以确保 has() 方法正确地计数包含软删除记录的关联数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

跟我一起学Laravel-EloquentORM基础部分

使用Eloquent [‘eləkwənt] 时,数据库查询构造器的方法对模型类也是也用的,使用上只是省略了DB::table('表名')部分。...) ->take(10) ->get(); 可以看到,查询构造器的方法对模型类也是可以使用的 在eloquent ORM中,get和all方法查询出多个结果集,它们的返回值是一个Illuminate...$flight = App\Flight::find(1); $flight->name = 'New Flight Name'; $flight->save(); 也可使用update方法对多个结果进行更新...,返回删除的行数 $deletedRows = App\Flight::where('active', 0)->delete(); 软删除 软删除是在表中增加deleted_at字段,当删除记录的时候不会真实删除记录...方法 if ($flight->trashed()) { // } 查询软删除的模型 包含软删除的模型 如果模型被软删除了,普通查询是不会查询到该结果的,可以使用withTrashed方法强制返回软删除的结果

85220
  • Laravel学习记录--Model

    Laravel 自带的 软删除功能 就利用全局作用域从数据库中提取「未删除」的模型。编写自定义的全局作用域可以提供一个方便、简单的方法来确保给定模型的每个查询都受到一定的约束。...,Eloquent提供了一些方法和这张表进行交互,如Stus关联了Mclass对象,在获取这些关联对象后,可以通过模型的pivot属性访问中间表数据 public function show(){...,如,获取有电话号码的用户,为了实现这个功能 可以通过has()方法,将建立关系的方法名传递给has即可 如 public function show(){ $res = Muser::...; dd($res); } 你还可以使用更高级的语法进行限制,通过whereHas和orwhereHas,在has查询里设置[where]条件 如查询用户至少有一个号码,并且号码包含...当获取模型记录时,你可能需要根据不存在的关联对结果进行限制,如获取没有电话号码的用户记录,为了实现这个功能你可以使用doesntHave,并传递关联方法 如 public function show

    13.6K20

    3分钟短文:Laravel 从软删除说到模型作用域的概念

    引言 上一节我们讲了通过模型方法新建条目,或者更新数据。对于写操作还有更为重要的一个方法, 就是数据的删除。删除数据,有物理删除和软删除的区别。 ?...我们从软删除的使用,再顺便说一说模型内的作用域的概念。 代码时间 常规的删除操作分两步进行,一步是把数据从数据库中查询出来,使用laravel模型的方法, 则返回的是一个模型对象。...所以引入了软删除的概念,就是在表内添加一个字段,用于标记,这一行条目是否算是删除状态。在laravel中, 这个软删除字段默认是 deleted_at。你也可以在模型中手动指定。...然后在模型中,引入软删除的功能,将其进行全局生效的使用。...写在最后 本文从laravel模型的写操作删除动作,讲到了软删除的概念。进而引申出来本地作用域和全局作用域的使用。软删除几乎贯穿了我们应用的始终,需要大家勤学苦练。

    1.4K30

    通过 Laravel Eloquent 模型实现批量赋值和软删除

    在上一篇教程中,我们基于 Eloquent 模型实现了对数据表记录的增删改查操作,今天我们在此基础上介绍两个 Eloquent 模型提供的高级功能 —— 批量赋值和软删除。...实现原理 Eloquent 模型类为我们提供了「软删除」功能的支持。这就意味着,在 Laravel 中,我们不需要编写任何额外代码就可以实现对数据库记录的「软删除」。...要软删除一条记录,在对应模型类实例上调用 delete 方法即可,底层会自动将数据表的 deleted_at 字段设置为当前时间,表示该记录已经被「删除」。...相关方法 要判断一条记录是否被软删除,可以通过 trashed 方法: $post = Post::findOrFail(32); $post->delete(); if ($post->trashed...在某些场景下,你可能只需要获取被软删除的记录,这可以通过 onlyTrashed 方法来实现: $post = Post::onlyTrashed()->where('views', 0)->get()

    2.5K10

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

    假如我们有两个模型:User 和 Account,分别对应注册用户和消费者,他们是一对一的关系,那么如果我们要使用 Eloquent 提供的一对一关系方法,表结构应该是这样的: user: id ......每一个 Model 中都指定表名 2. has one account 这样的关系写成 `hasOneAccount()` 而不是简单的 `account()` 3....() { return $this->belongsTo('User', 'user_id', 'id'); } } 一对多关系 学会了前面使用一对一关系的基础方法,后面的几种关系就简单多了...其他关系 Eloquent 还提供 “远层一对多关联”、“多态关联” 和 “多态的多对多关联” 这另外三种用法,经过上面的学习,我们已经掌握了 Eloquent 模型间关系的基本概念和使用方法,剩下的几种不常用的方法就留到我们用到的时候再自己探索吧...---- 至此,深入理解 Laravel Eloquent 系列文章到此结束。推荐继续了解 软删除 、转换成数组/JSON。 END

    2.7K30

    通过 Laravel Eloquent 模型实现简单增删改查操作

    一个 Eloquent 模型类映射一张数据表,通过模型类提供的方法,你可以获取其映射的数据表的所有记录,也可以获取单条记录,还可以创建、更新和删除对应数据表记录,而这一切都不需要你编写任何 SQL 语句...因为是查询构建器,所以我们还可以在模型查询操作中对查询结果进行排序和分页: $posts = Post::where('views', '>', 0)->orderBy('id', 'desc')->offset...同样,Eloquent 也为我们提供了快捷的更新方法 updateOrCreate,该方法首先会根据传入参数对模型对应记录进行更新,如果发现对应记录不存在,则会将更新数据作为初始数据插入数据库,并保存(...$post->delete(); 这样,就完成了 id = 31 对应数据表记录的删除,你还可以通过 Eloquent 提供的 destroy 方法一次删除多条记录,通过数组传递多个主键 ID 即可...,当然,Eloquent 的功能远不仅如此,还支持很多强大的功能,比如批量赋值、软删除、查询作用域设置、模型事件、关联关系等,下一篇教程开始学院君将带领大家来逐一了解这些高阶功能。

    8K20

    Laravel 如何实现数据的软删除

    对于任何一个模型,如果需要使用软删除功能,需要在模型中使用 Illuminate\Database\Eloquent\SoftDeletes这个 trait。...软删除功能需要实现的功能有以下几点: 1.模型执行删除操作,只标记删除,不执行真正的数据删除 2.查询的时候自动过滤已经标记为删除的数据 3.可以设置是否查询已删除的数据,可以设置只查询已删除的数据 4....已删除数据可以恢复 Model的软删除功能实现 Illuminate\Database\Eloquent\Model中delete方法源码: public function delete() {...方法会覆盖父类的方法,最终通过 runSoftDelete方法更新删除标记。...但是有的时候,项目中会使用一个整形的字段标记数据是否删除。在这样的场景下,需要对Laravel的软删除进行修改才能够实现。

    2.4K10

    3分钟短文:Laravel说要用软删除,可不要真删

    引言 我们不止一次在系列文章中讲到模型的“软删除”功能,因为现实场景中为了保证数据可追溯,我们几乎不会对数据库进行物理删除。删除数据有可能会造成数据一致性的破坏,进而导致业务逻辑无法跑通。...所以,软删除的概念,极为重要。 本文我们仍然不厌其烦地讲解软删除的功能。 物理删除 其实就是真实地把数据从数据库条目清除,laravel模型提供了开箱即用的方法。...方法进行删除。...软删除 在许多情况下,你不会真正想要从数据库中删除记录,而是用一种不再在应用程序中显示它们的方式对其进行注释。这就是所谓的软删除。...Laravel本身支持软删除,只需要进行少量的配置更改,以确保在执行delete或destroy时,模型的记录不会被实际删除。作为一个例子,我们修改Event模型以支持软删除。

    2.2K00

    Laravel 软删除存在的问题

    1、软删除使用的标记类型是时间类型,通过is null条件查询,删除标记取值不支持定义 //Illuminate\Database\Eloquent\SoftDeletingScope public...trait使用之后,不会对字段是否存在进行校验。...对应已经存在的表,有些表存在软删除,有些表不存在软删除字段,如果要应用软删除,只能在需要应用的model中一个个添加trait 如果重写Illuminate\Database\Eloquent\SoftDeletestrait...但是中间表的软删除不是通过scope实现的,关联关系对象在创建的时候就已经把中间表的软删除条件附加上去了,因此,即使指定了withTrashed,也会有中间表的软删除查询条件。...如果要修改,也可以,通过scope的方式附加软删除条件,这样就能保证软删除的查询条件是在真正查询的时候才附加上去。

    2.3K20

    3分钟短文:Laravel 检查记录是否被软删除

    学习时间 使用软删除功能,比较简单,只需要在模型中使用如下代码类: use Illuminate\Database\Eloquent\SoftDeletes; class User extends Model...= 'my_deleted_at'; } 如果要使用框架的格式化方法对该字段进行标准操作: protected $dates = ['my_deleted_at']; 检查条目 上一节介绍了默认的软删除使用方法...,和自定义软删除字段的方法。...使用了软删除功能后,会在模型的查询方法上,默认追加 where deleted_at is null 那么如果使用了全量查询后,如何判断一个记录是否是已经软删除的呢?laravel提供了这些功能。...写在最后 本文通过对laravel模型中软删除的源码分析, 为大家展示了引入软删除功能,并自定义软删除标记字段的方法。通过模型提供的方法,进而判断记录是否已软删除。

    1.5K30

    跟我一起学Laravel-EloquentORM高级部分

    查询作用域 全局作用域 全局作用域允许你对给定模型的所有查询添加约束。使用全局作用域功能可以为模型的所有操作增加约束。...软删除功能实际上就是利用了全局作用域功能 实现一个全局作用域功能只需要定义一个实现Illuminate\Database\Eloquent\Scope接口的类,该接口只有一个方法apply,在该方法中增加查询需要的约束...,deleting, deleted, restoring, restored 使用场景 假设我们希望保存用户的时候对用户进行校验,校验通过后才允许保存到数据库,可以在服务提供者中为模型的事件绑定监听...Eloquent提供了一些方法可以方便的来实现数据类型之间的转换。...Mutators 在Eloquent模型中,Accessor和Mutator可以用来对模型的属性进行处理,比如我们希望存储到表中的密码字段要经过加密才行,我们可以使用Laravel的加密工具自动的对它进行加密

    1.3K40

    orm 系列 之 Eloquent使用1

    Eloquent ORM 本文会是一个Eloquent的使用教程,在此之前,我们先讲述下怎么搭建环境,完整的系列请查看orm 基础环境的搭建 记录下怎么用docker搭建laravel的环境 新建项目composer...通过Eloquent的Scheme Builder构建数据库 通过使用Schema Builder我们可以在设计数据库的时候,不写一行sql,通过Schema Builder,我们可以 creating...,在闭包中设置了表的字段,最后通过build真正执行数据库操作,最后调用到了blueprint的build方法,传入的connection是数据库连接抽象,负责数据库执行操作,grammar负责sql的拼装...下面列举Schema支持的几个常用命令 // 重命名 Schema::rename($previousName, $newName); // 删除表 Schema::drop($tableName);...app/database/migrations/{migration}.php文件是所有对DB操作的动作,里面都是通过代码来完成DB操作的。

    1.7K20

    3分钟短文:Laravel 模型查询数据库的几个关键方法

    引言 本期继续我们的laravel学习,主要说一说laravel使用eloquent orm 模型 读取数据库条目的几个常用方法。 ?...eloquent门面为我们提供了很多好用的链式操作方法, 在query builder筛选出合适的条目后,返回一个eloquent collection,或者是一个 基类的collection对象,可以直接使用集合的方法操作数据集...所以我们推荐使用where语句进行数据库SQL操作,将合适的结果集返回,这样精简了数据库负载, 再者,使用集合的操作方法,对结果集进行进一步的格式化,效率会高的多。...如果返回的是多个条目,就不能用这些方法了: $vipContacts = Contact::where('vip', true)->get(); 有一个标准的方法 get,就是返回一个 eloquent...比如常用的数据统计,计数,求平均,求和等等等等,laravel调用起来的方法也极为简单, 像下面这样: $countVips = Contact::where('vip', true)->count()

    2.1K40

    Laravel学习笔记(四)——模型,更安全的数据存取

    前言 如果你是一个从没用接触过框架的新手,你在进行数据库操作的时候可能会创建数据库链接,然后进行数据操作,最后关闭数据库连接。...所以就有了MVC模式,根据程序需求自行封装数据库操作类,需要进行数据库操作时,引入类文件,new一个数据库对象即可。如果数据库信息更改,也只需要更改数据库操作类,提升了代码的复用,也便于后期维护。...本章只介绍几个常用的简单的获取数据的方法,详细方法会单独一章写出用作资料查询!...,你不需要考虑数据库连接与断开,也不需要知道SQL语句,你只需要按照Eloquent ORM提供的方法进行对应的操作即可。...$xiaoming = Student::find(1); $xiaoming->delete(); Eloquent ORM是通过调用laravel内置的方法来对数据库进行增删改查等操作的,这种方式很大程度上解决了数据库注入等安全问题

    1.7K00

    Laravel学习笔记(四)——模型,更安全的数据存取

    前言 如果你是一个从没用接触过框架的新手,你在进行数据库操作的时候可能会创建数据库链接,然后进行数据操作,最后关闭数据库连接。...所以就有了MVC模式,根据程序需求自行封装数据库操作类,需要进行数据库操作时,引入类文件,new一个数据库对象即可。如果数据库信息更改,也只需要更改数据库操作类,提升了代码的复用,也便于后期维护。...本章只介绍几个常用的简单的获取数据的方法,详细方法会单独一章写出用作资料查询!...,你不需要考虑数据库连接与断开,也不需要知道SQL语句,你只需要按照Eloquent ORM提供的方法进行对应的操作即可。...$xiaoming = Student::find(1); $xiaoming->delete(); Eloquent ORM是通过调用laravel内置的方法来对数据库进行增删改查等操作的,这种方式很大程度上解决了数据库注入等安全问题

    2.1K00
    领券