首页
学习
活动
专区
工具
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方法强制返回删除结果

85020

Laravel5.7 Eloquent ORM快速入门详解

chunk 方法会获取一个指定数量 Eloquent 模型“组块”,并将其填充到给定闭包进行处理。...删除 除了从数据库物理删除记录外,Eloquent 还可以对模型进行删除”。...delete 方法时,deleted_at 列将被设置为当前日期和时间,并且,当查询一个使用删除模型时,被删除模型将会自动从查询结果中排除。...判断给定模型实例是否被删除,可以使用 trashed 方法: if ($flight- trashed()) { // } 查询被删除模型 包含删除模型 正如上面提到删除模型将会自动从查询结果中排除...方法只获取删除模型: $flights = App\Flight::onlyTrashed() - where('airline_id', 1) - get(); 恢复删除模型 有时候你希望恢复一个被删除模型

15.1K41
  • 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

    Laravel5.1 框架模型删除操作实例分析

    分享给大家供大家参考,具体如下: 删除是比较实用一种删除手段,比如说 你有一本账 有一笔记录你觉得不对给删了 过了几天发现不应该删除,这时候删除目的就实现了 你可以找到已经被删除数据进行操作...1 普通删除删除之前咱先看看普通删除方法: 1.1 直接通过主键删除 public function getDelete() { Article::destroy(1);...2.3 判断数据是否被删除 if ($article- trashed()){ echo '这个模型已经被删除了'; } 2.4 查询到被删除数据 有一点需要注意,当数据被删除后...当我们想要查询删除数据时 可以使用withTrashed方法 public function getIndex() { $article = Article::withTrashed(...,它和withTrashed区别是 它只获得删除数据。

    1.3K20

    通过 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.4K10

    深入理解 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框架数据库操作、查询构建器、Eloquent ORM操作实例分析

    ,包括count(计数)、sum(求和)、avg(平均值)、max(最大值)、min(最小值),例如求年龄平均值: $res=DB::table('student')- avg('age'); 4、Eloquent...ORM ORM是对象关系映射(Object Relational Mapping)简称,是一种实现面向对象编程语言里不同类型系统数据之间转换技术,即将数据库中数据按照对象形式进行组织,可以便于面向对象程序进行数据库操作...Laravel内置Eloquent ORM提供了一种便捷方式帮助你组织数据库数据,每张数据表都对应一个与该表进行交互模型(Model),通过Model类,你可以对数据表进行查询、插入、更新、删除等操作...Eloquent ORM本质上是查询构建器,因此上面查询构建器所使用方法Eloquent都可以使用。...name'= 'orm3','age'= 13]); 删除数据也有两种方法,一是通过find方法删除指定主键,二是通过查询构建器: //destroy删除指定主键值 Student::destroy(1006,1007

    13.4K51

    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...通过EloquentScheme Builder构建数据库 通过使用Schema Builder我们可以在设计数据库时候,不写一行sql,通过Schema Builder,我们可以 creating...,在闭包中设置了表字段,最后通过build真正执行数据库操作,最后调用到了blueprintbuild方法,传入connection是数据库连接抽象,负责数据库执行操作,grammar负责sql拼装...下面列举Schema支持几个常用命令 // 重命名 Schema::rename($previousName, $newName); // 删除表 Schema::drop($tableName);...app/database/migrations/{migration}.php文件是所有DB操作动作,里面都是通过代码来完成DB操作

    1.7K20

    Laravel框架自定义验证过程实例分析

    ,即,我们可以手动确定表单提交到哪个控制器以及对应该控制器下方法,所以接下来问题就是如何使Laravel知道我们确定该用户已经通过了验证了。...($post_password,'PASSWORD_BCRYPT')处理,然后跟数据库中存储值进行比较,相等则验证通过,不相等,则自然验证失败。...这里再穿插一个知识点,当你使用Eloquent作为数据库驱动时,你需要新建一个用户类,User.php,你可以使用命令行来新建该模型,也可以直接手动新建,但是注意,命令行新建该模型是存在问题,Auth...extends Model implements AuthenticatableContract { use Authenticatable, CanResetPassword; // 这个参数是关于删除...,如果你有删除需要,那么你可以加上 // use SoftDeletes; }

    4.8K20
    领券