You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 20:12:36