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

HTTP请求生命周期内是否需重新加载Eloquent模型信息?

Laravel 9.x Eloquent 模型刷新

若已拥有从数据库获取的Eloquent模型实例,可通过fresh和refresh方法「刷新」模型。fresh方法会从数据库重新获取模型,不会影响现有实例:

$flight = Flight::where('number', 'FR 900')->first();
$freshFlight = $flight->fresh();

refresh方法会使用数据库中的最新数据为现有模型「重新填充」,同时还会刷新所有已加载的关联关系:

$flight = Flight::where('number', 'FR 900')->first();
$flight->number = 'FR 456';
$flight->refresh();
$flight->number; // "FR 900"

何时需要重新加载模型或关联信息?

当当前请求的模型实例数据已被其他操作修改(如队列任务、外部服务、同一请求内的其他逻辑更新了数据库),且你需要获取最新状态时,就需要重新加载;另外,若在当前请求中修改了模型实例属性,但想丢弃这些修改回到数据库原始状态,也需要刷新模型。

fresh()/refresh()的使用场景

fresh()适用场景

  • 需要保留原模型实例的修改,同时获取数据库最新版本用于对比(比如校验修改前后的数据差异)
  • 原模型已被本地修改,但不想覆盖原实例,需要全新的、与数据库同步的独立实例
  • 仅需获取模型本身的最新数据,无需刷新已加载的关联(fresh()默认不加载关联,可传参数指定)

refresh()适用场景

  • 想丢弃当前模型实例的所有本地修改,直接同步数据库的最新状态
  • 当前请求内执行了数据库更新操作(如调用save()、update(),或通过其他模型修改了当前实例的数据),需要让当前实例持有最新数据
  • 需要同时刷新已加载的关联关系,确保关联数据也是最新状态

易遗漏的知识点

  • 关联刷新的灵活性:refresh()会自动刷新所有已加载的关联,而fresh()默认不加载关联,若要获取带指定关联的最新模型,可传参数:$flight->fresh(['airline'])
  • 性能注意事项:每次调用fresh()或refresh()都会发起新的数据库查询,高频调用可能影响性能,需避免无意义的刷新
  • 链式调用支持:refresh()会返回当前模型实例,可链式调用后续方法:$flight->refresh()->load('passengers')
  • 集合刷新方式:模型集合可调用$flights->fresh()批量获取每个模型的最新实例(返回新集合),但集合没有refresh()方法,需遍历单个调用
  • 避免方法混淆:Laravel中没有reload()方法,不要与其他框架的同名方法混淆,refresh()是重新填充当前实例的官方方法

内容的提问来源于stack exchange,提问作者user19551894

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:37:45