Laravel Eloquent中save、fill、create三种方法的区别解析
Hey there! 作为刚摸过Laravel门槛的过来人,我太懂你纠结这三个方法的心情了~今天把它们的区别掰得明明白白,看完你就能精准拿捏什么时候用哪个:
1.
save():手动操控的「灵活选手」 save() 是最基础的持久化方法,核心特点是先实例化模型,手动设置属性,最后触发保存,而且它既能用来新增数据,也能用来更新已有数据。
举个新增的例子:
// 先创建一个空的模型实例 $user = new User(); // 手动给属性赋值(可以单个或多个) $user->name = 'John Doe'; $user->email = 'john@example.com'; // 最后调用save()把数据写入数据库 $user->save();
如果是更新数据,就先通过查询拿到已有模型,修改后再save:
// 找到ID为1的用户 $user = User::find(1); // 修改属性 $user->name = 'Jane Doe'; // 保存更新 $user->save();
这种方式适合你需要在保存前做额外操作的场景——比如加个日志、验证某个字段、甚至调用其他方法处理数据,完全由你掌控节奏。
2.
fill():批量赋值的「预备选手」 fill() 是专门用来批量给模型属性赋值的,但它有个关键:不会自动把数据保存到数据库!你必须手动再调用save()才会持久化。
而且用fill()之前,一定要确保你的模型里设置了$fillable(允许批量赋值的字段)或者$guarded(禁止批量赋值的字段,一般设为[]表示全部允许),否则会触发批量赋值安全限制的报错。
例子:
$user = new User(); // 用数组批量填充属性 $user->fill([ 'name' => 'John Doe', 'email' => 'john@example.com' ]); // 这时候数据还在内存里,没进数据库,你可以先做些别的: $user->password = bcrypt('123456'); // 最后调用save()保存 $user->save();
这个方法适合你需要批量赋值,但又不想马上保存,得先补点其他数据或者做校验的场景,相当于把“填充”和“保存”拆成了两步。
3.
create():一步到位的「高效选手」 create() 是个静态方法,它把「实例化模型+批量赋值+保存到数据库」这三步合并成了一步,直接返回保存后的模型实例。
同样,它也受$fillable或$guarded的限制,必须先设置好允许批量赋值的字段。
例子:
// 直接传数组,一步完成创建和保存,返回已经入库的模型 $user = User::create([ 'name' => 'John Doe', 'email' => 'john@example.com', 'password' => bcrypt('123456') ]);
这种方式超级简洁,适合你不需要额外操作,直接创建并保存数据的场景,比如表单提交后直接入库,代码少又清晰。
一句话总结适用场景
- 分步操作、需要中间处理逻辑?用
save() - 批量赋值但不想马上保存?用
fill()+save() - 一步完成创建保存?直接上
create()
内容的提问来源于stack exchange,提问作者maulik savaliya
相关产品推荐
相关产品推荐

