这些方法返回单个模型实例而不是模型集合: // 通过主键获取模型... $flight = App\Flight::find(1); // 获取匹配查询条件的第一个模型......你还会碰到如果模型已存在则更新,否则创建新模型的场景,Laravel 提供了一个 updateOrCreate 方法来一步完成。...和 firstOrCreate 方法一样,updateOrCreate 方法会持久化模型,所以无需调用 save(): // 如果有从奥克兰到圣地亚哥的航班则将价格设置为 $99 // 如果没有匹配的模型则创建之...当模型被软删除后,它们并没有真的从数据库删除,而是在模型上设置一个 deleted_at 属性并插入数据库,如果模型有一个非空 deleted_at 值,那么该模型已经被软删除了。...Laravel 自带的软删除功能就使用了全局作用域来从数据库中拉出所有没有被删除的模型。编写自定义的全局作用域可以提供一种方便的、简单的方式来确保给定模型的每个查询都有特定的条件约束。
比如我们前面几篇教程中用到的 User 模型和 Post 模型都是这样,要创建一个模型类,需要使用 make:model 命令: php artisan make:model Post 注:如果对应的数据表尚未创建...此外,Eloquent 还为我们提供了一些快捷的插入方法,比如 firstOrCreate 和 firstOrNew,这两个方法都会先尝试通过指定查询条件在数据库中查找对应记录,如果没有找到的话,会创建对应模型类的实例...底层会自动帮我们维护,执行上面的代码即可完成该 $post 模型对应数据表记录的更新: ?...同样,Eloquent 也为我们提供了快捷的更新方法 updateOrCreate,该方法首先会根据传入参数对模型对应记录进行更新,如果发现对应记录不存在,则会将更新数据作为初始数据插入数据库,并保存(...,当然,Eloquent 的功能远不仅如此,还支持很多强大的功能,比如批量赋值、软删除、查询作用域设置、模型事件、关联关系等,下一篇教程开始学院君将带领大家来逐一了解这些高阶功能。
();//软删除查询 ->toArray() 结果对象转换数组 Model::create([]) //插入数据 Model::save([]) //更新数据 Model::updateOrCreate...([]) //存在即更新,反之则创建 Model::firstOrCreate([]) //存在即跳过,反之则创建 //关联查询 Model::with('relation')->get();//将关联数据一起查出来...=>function($query){}])->get();//只查找符合条件的关联数据 Model::whereHas('relation',function($query){ ... })->get...();//1对多关联,查找关联数据符合条件的数据 Model::whereNotExists(function($query){ $query->from('relation_table')->where...(''); })->get();//查找不符合条件的数据 Model::withCount(['marks as marks_avg'=>function($query){ $query->select
GORM 可以根据指定的删除条件,批量删除全部匹配的记录。...软删除 如果模型包含 gorm.DeletedAt 字段,将会启用软删除,软删除是指不会真的删除记录,而是会将 DeletedAt 字段设置为当前时间,并且被软删除的记录,不可以通过正常查询操作获取。...如果需要查询被软删除的记录,需要使用 Unscoped 方法。 永久删除 永久删除记录,也需要使用 Unscoped 方法。 gormDB.Unscoped().Where("id = ?"...如果未通过 Model 方法指定记录的主键,GORM 则会执行批量更新。...如果希望执行全局更新,需要指定条件,或使用原生 SQL,或启用 AllowGlobalUpdate 模式。 更新的记录数和更新操作的错误 获取受影响的行数和更新操作的错误。
{ } User会自动匹配对于数据库中的数据表tp_user 模型命名后缀,是为了防止关键字冲突,可以开启应用类后缀:创建Class UserModel use think\Model;...更新操作: 更新的最佳实践原则是:如果需要使用模型事件,那么就先查询后更新,如果不需要使用事件或者不查询直接更新,直接使用静态的Update方法进行条件更新,如非必要,尽量不要使用批量更新。...JSON部分 ---- 模型软删除 在实际项目中,对数据频繁使用删除操作会导致性能问题,软删除的作用就是把数据加上删除标,而不是真正的删除,同时也便于需要的时候进行数据的恢复。...->delete(); // 真实删除 $user->force()->delete(); 软删除后系统会忽略该条数据,模型会自动屏蔽数据 使用withTrashed()取消屏蔽软删除的数据 使用...onlyTrashend()可以查询被软删除的数据 使用restore()可以恢复被软删除的数据 如果需要强制删除,需要使用force()强制安排 ---- 模型和数据库的事件 数据库事件
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 字段,它将自动拥有软删除的能力!
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也可以。。
对于任何一个模型,如果需要使用软删除功能,需要在模型中使用 Illuminate\Database\Eloquent\SoftDeletes这个 trait。...软删除功能需要实现的功能有以下几点: 1.模型执行删除操作,只标记删除,不执行真正的数据删除 2.查询的时候自动过滤已经标记为删除的数据 3.可以设置是否查询已删除的数据,可以设置只查询已删除的数据 4...这样就可以在查询条件中添加一个全局条件。Laravel中软删除数据的过滤也是使用这种方式实现的。...如果是远程关联,则还需要额外的处理。Laravel远程关联关系通过hasManyThrough实现。里面有两个地方涉及到软删除的查询。...,会根据throughParentSoftDeletes判断中间模型是否有软删除,如果有软删除会过滤掉中间模型被删除的数据。
引言 上一节我们讲了通过模型方法新建条目,或者更新数据。对于写操作还有更为重要的一个方法, 就是数据的删除。删除数据,有物理删除和软删除的区别。 ?...我们从软删除的使用,再顺便说一说模型内的作用域的概念。 代码时间 常规的删除操作分两步进行,一步是把数据从数据库中查询出来,使用laravel模型的方法, 则返回的是一个模型对象。...然后在模型中,引入软删除的功能,将其进行全局生效的使用。...如果是想软删除条目那样,默认把所有的查询都追加 自定义的查询条件,就需要我们上面说的全局作用域了。...写在最后 本文从laravel模型的写操作删除动作,讲到了软删除的概念。进而引申出来本地作用域和全局作用域的使用。软删除几乎贯穿了我们应用的始终,需要大家勤学苦练。
App\Flight::find(1); // 获取匹配查询条件的第一个模型 $flight = App\Flight::where('active', 1)->first(); // 通过传递主键数组来调用...->delete(); 软删除 // Eloquent 模型 use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent..., 可以使用 trashed 方法 if ($flight->trashed()) { // ... } // 查询被软删除的模型 $flights = App\Flight::withTrashed...() ->where('account_id', 1) ->get(); $flight->history()->withTrashed()->get(); // 只获取软删除模型 $...flights = App\Flight::onlyTrashed() ->where('airline_id', 1) ->get(); // 恢复软删除模型 $flight->restore
其中 Save 方法在保存记录时,如果主键 ID 非空则执行更新操作,零值也会更新到 DB。如果主键 ID 为空,则执行插入操作。 增加多个 我们还可以使用 Create() 创建多项记录。...指定的值没有主键值,GORM会执行批量删除,它会删除所有匹配的记录。..., "%jinzhu%") // DELETE FROM users WHERE name LIKE "%jinzhu%" AND id IN (1,2,3); 软删除 如果您的模型包含了一个 gorm.DeletedAt...字段(gorm.Model 已经包含了该字段),它将自动获得软删除的能力!...string } 拥有软删除能力的模型调用 Delete 时,记录不会被数据库。
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(); 还原软删除的模型 查询到软删除的模型实例之后
最近刚好用上模型事件,但手册上对事件的触发条件却没有详细的进行说明。那么,就只能自己进行测试了。...如果是模型静态调用update(),则执行的是模型的update方法,而模型的update方法会调用save()方法,所以跟模型的save()方法一样,会触发写入前、更新前、更新后、写入后事件 感谢 @...dejavu 的提醒 save() 使用模型的save()方法来更新数据,会触发写入前、更新前、更新后、写入后事件。...delete() 如果是使用模型方法查询出来数据,然后再删除数据,则会触发删除前、删除后事件。 如果是直接使用条件删除,则不会触发模型事件。...因为直接使用条件删除,这时候的delete()方法不是模型方法。 find() 该查询方法会触发查询后事件 destroy() 该删除数据方法会触发查询后、删除前、删除后。
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
// 条件更新 db.Model(&User{}).Where("active = ?"...-11-17 21:34:10' WHERE id=111; // 根据条件和 model 的值进行更新 db.Model(&user).Where("active = ?"...gorm.DeletedAt 字段(gorm.Model 已经包含了该字段),它将自动获得软删除的能力!...如果您不想引入 gorm.Model,您也可以这样启用软删除特性: type User struct { ID int Deleted gorm.DeletedAt Name...string } 拥有软删除能力的模型调用 Delete 时,记录不会被数据库。
所以在我的理解中,数据库模块中的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 要删除 使用模型,还有很多用处
当使用了 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 置为当前时间, 并且你不能再通过普通的查询方法找到该记录。
本文实例讲述了Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作。...Model{ //使用软删除 //删除时,默认更新的字段是delete_time use SoftDelete; //如果修改修改默认的字段名字 protected $deleteTime...= 'deltime'; } 控制器: $res = User::destroy(1);//软删除 //返回影响的行数 dump($res); 执行删除后,就会更新delete_time字段,如果update_time...字段也开启了自动完成,也会更新update_time字段。...是15的记录,如果开启软删除,会进行假删除 $res = User::destroy(15); //如果开启了软删除,需要真正地删除数据,不做软删除 //destory()第二个参数传递true $res
分享给大家供大家参考,具体如下: 使用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(); //获取所有软删除的数据 更多关于
对应已经存在的表,有些表存在软删除,有些表不存在软删除字段,如果要应用软删除,只能在需要应用的model中一个个添加trait 如果重写Illuminate\Database\Eloquent\SoftDeletestrait...,如果类常量DELETED_AT为null,则不执行相应的软删除操作 4、join操作,只会在对当前模型添加软删除查询条件 5、在belonsToMany关联关系中,如果关联表,中间表,被关联表都有软删除字段...被关联表是一个类对象,如果应用了软删除,则会自动附加上软删除条件 6、在hasManyThrough关联关系中,如果关联表,中间表,被关联表都有软删除字段,查询关联关系,会对中间表应用删除条件。...但是,如果要查询包含已删除的关联关系,中间表的删除标记条件不会去除。 hasManyThrough中,中间表是通过中间对象传入,可以获取到中间表是否应用软删除。...如果要修改,也可以,通过scope的方式附加软删除条件,这样就能保证软删除的查询条件是在真正查询的时候才附加上去。
领取专属 10元无门槛券
手把手带您无忧上云