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

如果条件匹配,Model::updateOrCreate()会更新软删除的模型吗?

Model::updateOrCreate() 是 Laravel 框架中的一个方法,用于根据给定的条件更新现有模型或创建新模型。这个方法结合了 updatecreate 的功能,如果数据库中存在匹配条件的记录,则更新该记录;如果不存在,则创建一个新的记录。

基础概念

  • 软删除:Laravel 提供了一种软删除机制,允许你在数据库中标记记录为已删除,而不是真正从数据库中移除这些记录。这通常通过在数据表中添加一个 deleted_at 字段来实现。
  • updateOrCreate():这个方法会首先尝试根据给定的条件查找记录。如果找到了,它会更新该记录;如果没有找到,它会根据给定的属性创建一个新的记录。

是否更新软删除的模型

默认情况下,Model::updateOrCreate() 不会更新标记为软删除的记录。软删除的记录在查询时会被自动排除,除非你使用了 withTrashed()onlyTrashed() 方法来包含这些记录。

解决方法

如果你需要在特定情况下更新软删除的记录,你可以使用 withTrashed() 方法来包含这些记录。例如:

代码语言:txt
复制
Model::withTrashed()->updateOrCreate(
    ['id' => $id],
    ['field' => 'value']
);

在这个例子中,即使记录被软删除(deleted_at 不为空),updateOrCreate() 也会尝试更新它。

应用场景

  • 当你需要在特定条件下恢复软删除的记录时。
  • 当你需要对软删除的记录进行批量更新时。

示例代码

以下是一个完整的示例,展示了如何在 Laravel 中使用 withTrashed() 来更新软删除的记录:

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

// 假设我们有一个模型 YourModel,并且我们希望更新 id 为 1 的记录,即使它被软删除了
$updated = YourModel::withTrashed()
    ->updateOrCreate(
        ['id' => 1],
        ['field' => 'new_value']
    );

if ($updated) {
    // 更新成功
} else {
    // 没有找到匹配的记录或更新失败
}

参考链接

通过这种方式,你可以灵活地处理软删除的记录,并在需要时更新它们。

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

相关·内容

Laravel5.7 Eloquent ORM快速入门详解

这些方法返回单个模型实例而不是模型集合: // 通过主键获取模型... $flight = App\Flight::find(1); // 获取匹配查询条件第一个模型......你还会碰到如果模型已存在则更新,否则创建新模型场景,Laravel 提供了一个 updateOrCreate 方法来一步完成。...和 firstOrCreate 方法一样,updateOrCreate 方法会持久化模型,所以无需调用 save(): // 如果有从奥克兰到圣地亚哥航班则将价格设置为 $99 // 如果没有匹配模型则创建之...当模型删除后,它们并没有真的从数据库删除,而是在模型上设置一个 deleted_at 属性并插入数据库,如果模型有一个非空 deleted_at 值,那么该模型已经被删除了。...Laravel 自带删除功能就使用了全局作用域来从数据库中拉出所有没有被删除模型。编写自定义全局作用域可以提供一种方便、简单方式来确保给定模型每个查询都有特定条件约束。

15.1K41

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

比如我们前面几篇教程中用到 User 模型和 Post 模型都是这样,要创建一个模型类,需要使用 make:model 命令: php artisan make:model Post 注:如果对应数据表尚未创建...此外,Eloquent 还为我们提供了一些快捷插入方法,比如 firstOrCreate 和 firstOrNew,这两个方法都会先尝试通过指定查询条件在数据库中查找对应记录,如果没有找到的话,创建对应模型实例...底层自动帮我们维护,执行上面的代码即可完成该 $post 模型对应数据表记录更新: ?...同样,Eloquent 也为我们提供了快捷更新方法 updateOrCreate,该方法首先会根据传入参数对模型对应记录进行更新如果发现对应记录不存在,则会将更新数据作为初始数据插入数据库,并保存(...,当然,Eloquent 功能远不仅如此,还支持很多强大功能,比如批量赋值、删除、查询作用域设置、模型事件、关联关系等,下一篇教程开始学院君将带领大家来逐一了解这些高阶功能。

8K20
  • GORM V2 写操作

    GORM 可以根据指定删除条件,批量删除全部匹配记录。...删除 如果模型包含 gorm.DeletedAt 字段,将会启用删除删除是指不会真的删除记录,而是会将 DeletedAt 字段设置为当前时间,并且被删除记录,不可以通过正常查询操作获取。...如果需要查询被删除记录,需要使用 Unscoped 方法。 永久删除 永久删除记录,也需要使用 Unscoped 方法。 gormDB.Unscoped().Where("id = ?"...如果未通过 Model 方法指定记录主键,GORM 则会执行批量更新。...如果希望执行全局更新,需要指定条件,或使用原生 SQL,或启用 AllowGlobalUpdate 模式。 更新记录数和更新操作错误 获取受影响行数和更新操作错误。

    2.7K10

    ThinkPHP6.0学习笔记-模型操作

    { } User自动匹配对于数据库中数据表tp_user 模型命名后缀,是为了防止关键字冲突,可以开启应用类后缀:创建Class UserModel use think\Model;...更新操作: 更新最佳实践原则是:如果需要使用模型事件,那么就先查询后更新如果不需要使用事件或者不查询直接更新,直接使用静态Update方法进行条件更新,如非必要,尽量不要使用批量更新。...JSON部分 ---- 模型删除 在实际项目中,对数据频繁使用删除操作导致性能问题,删除作用就是把数据加上删除标,而不是真正删除,同时也便于需要时候进行数据恢复。...->delete(); // 真实删除 $user->force()->delete(); 删除后系统忽略该条数据,模型自动屏蔽数据 使用withTrashed()取消屏蔽删除数据 使用...onlyTrashend()可以查询被删除数据 使用restore()可以恢复被删除数据 如果需要强制删除,需要使用force()强制安排 ---- 模型和数据库事件 数据库事件

    3.9K30

    gorm 教程 一

    DeletedAt对于有 DeletedAt 字段模型,当删除它们实例时,它们并没有被从数据库中删除,只是将 DeletedAt 字段设置为当前时间。...WHERE id = 10 FOR UPDATE;FirstOrInit获取第一条匹配记录,或者通过给定条件下初始一条新记录(仅适用与于 struct 和 map 条件)。...,没有东西会被更新,因为像 "", 0, false 是这些字段类型空值db.Model(&user).Updates(User{Name: "", Age: 0, Actived: false})更新选中字段如果你在执行更新操作时只想更新或者忽略某些字段...如果主键字段为空,GORM删除模型中所有的记录。..., "%jinzhu%")//// DELETE from emails where email LIKE "%jinzhu%";删除如果模型中有 DeletedAt 字段,它将自动拥有删除能力!

    28200

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

    引言 上一节我们讲了通过模型方法新建条目,或者更新数据。对于写操作还有更为重要一个方法, 就是数据删除删除数据,有物理删除删除区别。 ?...我们从删除使用,再顺便说一说模型作用域概念。 代码时间 常规删除操作分两步进行,一步是把数据从数据库中查询出来,使用laravel模型方法, 则返回是一个模型对象。...然后在模型中,引入删除功能,将其进行全局生效使用。...如果是想删除条目那样,默认把所有的查询都追加 自定义查询条件,就需要我们上面说全局作用域了。...写在最后 本文从laravel模型写操作删除动作,讲到了删除概念。进而引申出来本地作用域和全局作用域使用。删除几乎贯穿了我们应用始终,需要大家勤学苦练。

    1.4K30

    Laravel 如何实现数据删除

    对于任何一个模型如果需要使用删除功能,需要在模型中使用 Illuminate\Database\Eloquent\SoftDeletes这个 trait。...删除功能需要实现功能有以下几点: 1.模型执行删除操作,只标记删除,不执行真正数据删除 2.查询时候自动过滤已经标记为删除数据 3.可以设置是否查询已删除数据,可以设置只查询已删除数据 4...这样就可以在查询条件中添加一个全局条件。Laravel中删除数据过滤也是使用这种方式实现。...如果是远程关联,则还需要额外处理。Laravel远程关联关系通过hasManyThrough实现。里面有两个地方涉及到删除查询。...,根据throughParentSoftDeletes判断中间模型是否有删除如果删除过滤掉中间模型删除数据。

    2.4K10

    【说站】laravel模型$casts属性转换

    update; 想想都觉得麻烦,虽然可以使用laravel模型事件,在对应creating或updating事件中去处理,但这也太大材小用了。...从 Illuminate\Database\Eloquent\Model 找到 Illuminate\Database\Eloquent\Concerns\HasAttributes ,会发现有很多属性可供配置...[     'recharge => 'array',]; 设置过后,从前端拿到或者处理出来字段array数据,就不需要手动去json_encode,update时候也不要管,自动帮我们转为json...但是需要注意是,在create时候进行属性转换处理,但是在更新时候,如果是直接使用update进行更新,则不会进行属性转换处理。...可参考:laravel模型事件-update触发updating和updated问题 先使用first或者find获取模型后再操作即可,当然,updateOrCreate也可以。。

    1.8K10

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

    where('legs', '>', 100)->firstOrFail(); 如果没有捕获这个异常的话,laravel自动返回给用户一个404响应结果,因此如果希望找不到时候返回404,是可以直接使用该方法返回...,设置模型属性为新值,然后再save就可以更新了,updated_at字段自动更新。...,返回删除行数 $deletedRows = App\Flight::where('active', 0)->delete(); 删除 删除是在表中增加deleted_at字段,当删除记录时候不会真实删除记录...方法 if ($flight->trashed()) { // } 查询删除模型 包含删除模型 如果模型删除了,普通查询是不会查询到该结果,可以使用withTrashed方法强制返回删除结果...$flights = App\Flight::onlyTrashed() ->where('airline_id', 1) ->get(); 还原删除模型 查询到删除模型实例之后

    85020

    ThinkPHP6之模型事件触发条件

    最近刚好用上模型事件,但手册上对事件触发条件却没有详细进行说明。那么,就只能自己进行测试了。...如果模型静态调用update(),则执行模型update方法,而模型update方法会调用save()方法,所以跟模型save()方法一样,触发写入前、更新前、更新后、写入后事件 感谢 @...dejavu 提醒 save() 使用模型save()方法来更新数据,触发写入前、更新前、更新后、写入后事件。...delete() 如果是使用模型方法查询出来数据,然后再删除数据,则会触发删除前、删除后事件。 如果是直接使用条件删除,则不会触发模型事件。...因为直接使用条件删除,这时候delete()方法不是模型方法。 find() 该查询方法会触发查询后事件 destroy() 该删除数据方法会触发查询后、删除前、删除后。

    82341

    Go开源ORM——GORM

    db.Model(&user).Updates(User{Name: "", Age: 0, Actived: false}) 删除 通过Delete方法删除记录,如果记录中包含了DeletedAt字段...,那么将不会真正删除该记录,只是设置了该记录该字段为当前时间(删除),通过Unscoped方法返回对象调用Find、Delete可以执行到被删除对象,进行查询或者永久删除 db.Delete(...,需要注意是,如果传入Find、First、Last等方法结构体对象设置了主键值,则该主键值作为查询条件之一 通过Where方法创建查询条件对象(可选,不使用为全表数据),然后使用 Find 方法...作为参数占位符,如果参数是集合类型,使用(?)作为占位符 // 获取第一个匹配记录 db.Where("name = ?"...// 如果这些条件匹配,将返回一个错误,检查它: // db.Model(&user).Association("Languages").Error // Query - 查找所有相关关联 db.Model

    2.1K41

    Thinkphp中模型正确使用方式,ORM思想概念

    所以在我理解中,数据库模块中ORM思想并不多,重点还是要了解和运用模型 tp中模型 定义模型文件 namespace app\index\model; use think\Model; //...(什么时间插入 什么时间更新) protected $autoWriteTimestamp = true; // 删除 开启之后 删除数据只是用一个字段来标识为删除状态 方便查询、...① model只当为Db类用 虽然model可以看成db类超集,但是如果只是把它当成简单DB类使用,而不是使用ORM思想去编写。那么就没什么必要使用它了。。...你代码有出现过这样子? 我相信还是有些人这样子用吧!因为我以前也是这样子用。 那么我们看看正确使用方法(我认为如果觉得不对或者有更好,欢迎评论交流) <?...执行其他逻辑 因为一个对象映射一条数据,所以我们在操作同样where条件数据,直接操作对象就可以了, 就不用反复编写where u_id =1更新, u_id = 1 要删除 使用模型,还有很多用处

    2.2K20

    Gorm实战,轻松掌握数据库增删改查技巧!

    当使用了 Model 方法,且该对象主键有值,该值会被用于构建条件,例如: var student Student // 条件更新(如果有多条,全更新) db.Model(&Student{})....4.6.1 批量更新 如果您尚未通过 Model 指定记录主键,则 GORM 执行批量更新 // 根据 struct 更新--->批量更新不能用Hook db.Model(&student).Where...如果指定值不包括主属性,那么 GORM 执行批量删除,它将删除所有匹配记录 db.Where("name LIKE ?"...如果模型包含了一个 gorm.deletedat 字段(gorm.Model 已经包含了该字段),它将自动获得删除能力!...拥有删除能力模型调用 Delete 时,记录不会被数据库。但 GORM 会将 DeletedAt 置为当前时间, 并且你不能再通过普通查询方法找到该记录。

    3.3K20

    TP5框架model常见操作示例小结【增删改查、聚合、时间戳、删除等】

    分享给大家供大家参考,具体如下: 使用model 查询数据,添加数据,修改数据,删除数据 聚合操作 获取器,修改器 自动添加时间戳(创建时间,修改时间) 删除 1、使用model查询数据 $res =.../设置 创建和更新时候写入 字段 ,值可以为false,关闭操作 10、删除 // model // 数据表中字段 delete_time,默认值可以为 null use traits\model...\SoftDelete; //使用删除类 class User extends Model { use SoftDelete; //在类开头 use SoftDelete;...) 没值时,为删除;值为true,tm真删 // controller 获取到 删除 记录 $res = User::withTrashed(true)- find(1); //得到id为1...经过删除 删除记录 dump($res- getData()); //获取原始数据 $res = User::onlyTrashed()- select(); //获取所有删除数据 更多关于

    1.2K30

    Laravel 删除存在问题

    对应已经存在表,有些表存在删除,有些表不存在删除字段,如果要应用删除,只能在需要应用model中一个个添加trait 如果重写Illuminate\Database\Eloquent\SoftDeletestrait...,如果类常量DELETED_AT为null,则不执行相应删除操作 4、join操作,只会在对当前模型添加删除查询条件 5、在belonsToMany关联关系中,如果关联表,中间表,被关联表都有删除字段...被关联表是一个类对象,如果应用了删除,则会自动附加上删除条件 6、在hasManyThrough关联关系中,如果关联表,中间表,被关联表都有删除字段,查询关联关系,会对中间表应用删除条件。...但是,如果要查询包含已删除关联关系,中间表删除标记条件不会去除。 hasManyThrough中,中间表是通过中间对象传入,可以获取到中间表是否应用删除。...如果要修改,也可以,通过scope方式附加删除条件,这样就能保证删除查询条件是在真正查询时候才附加上去。

    2.3K20
    领券