Laravel中firstOrNew搭配update能否避免重复数据并实现更新?
你的疑问解答及代码优化建议
首先直接回应你的核心疑问:
firstOrNew()确实会先根据你传入的$row条件去数据库查询匹配记录:如果找到对应数据,就返回已存在的模型实例;如果没找到,会创建一个新的、未保存到数据库的模型实例(划重点:新实例此时还没入库)。- 但你当前的写法存在问题:如果是新创建的未保存实例,调用
update()方法会直接报错——因为update()是针对已存在于数据库的记录(有主键ID)执行更新SQL的,新实例没有主键,根本无法触发更新操作。
更适配你需求的方案:用firstOrUpdate()
你想要的「已有数据则更新,无数据则创建」逻辑,Laravel里刚好有专门的方法firstOrUpdate(),完美匹配你的场景:
- 先根据指定条件查询数据库
- 找到匹配记录:直接用传入的数据更新该记录
- 没找到匹配记录:自动创建新记录并保存到数据库
优化后的代码示例:
$googleResponse->map(function ($row) { // 第一个参数:用来判断记录是否存在的查询条件(建议用唯一标识字段,比如google平台的唯一ID) // 第二个参数:要更新或填充到新记录的数据 Google::firstOrUpdate( ['google_unique_id' => $row['google_unique_id']], $row ); });
如果你坚持想用firstOrUpdate()的替代写法
要是你更习惯用firstOrNew(),可以调整写法,用save()方法(它既能保存新实例,也能更新已有实例):
$googleResponse->map(function ($row) { $es = Google::firstOrNew(['google_unique_id' => $row['google_unique_id']]); $es->fill($row); // 把数据填充到模型实例 $es->save(); // 新实例执行insert,已有实例执行update });
不过显然firstOrUpdate()更简洁直接,完全贴合你的业务需求。
内容的提问来源于stack exchange,提问作者Spacex
相关产品推荐
相关产品推荐

