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
相关产品推荐
相关产品推荐

