Laravel 8.x中如何为updateOrCreate方法添加where查询条件
问题原因说明
- 首次代码错误:
updateOrCreate第一个参数仅支持等值匹配逻辑,你传入的范围查询数组会被直接当作字段值匹配,无法触发范围查询,始终匹配不到符合条件的记录,因此只会执行新增逻辑。 - 第二次代码错误:你直接将查询构造器(Builder)对象作为
created_at的匹配值,框架尝试将对象转为字符串做等值匹配时触发类型错误。
正确实现方案
由于updateOrCreate原生不支持范围查询作为匹配条件,我们需要先手动查询符合要求的记录,再分情况执行更新/新增操作:
// 构造时间范围 $startDate = \Carbon\Carbon::now()->startOfMonth()->subMonthsNoOverflow(); $endDate = \Carbon\Carbon::now()->endOfMonth(); // 查询符合条件的记录 $result = \App\Models\Result::where('id', $request->get('id')) ->whereBetween('created_at', [$startDate, $endDate]) ->first(); $updateData = [ 'discipline_one' => $request->get('d-one'), 'discipline_two' => $request->get('d-two'), 'discipline_three' => $request->get('d-three'), 'discipline_four' => $request->get('d-four'), 'discipline_five' => $request->get('d-five'), 'discipline_six' => $request->get('d-six'), ]; if ($result) { // 符合条件则更新 $result->update($updateData); } else { // 不符合条件则新增,若id为自增主键,无需手动传入id字段 $result = \App\Models\Result::create(array_merge( ['id' => $request->get('id')], // 自增id可删除此行 $updateData )); }
注意事项
- 如果你的
id字段是自增主键,创建新记录时不要手动传入id,删除数组中对应的id项即可。 - 该实现逻辑完全匹配需求:仅当指定id的记录存在且创建时间在近两个月时才更新,其余情况均创建新记录。
内容的提问来源于stack exchange,提问作者Jaquarh
相关产品推荐
相关产品推荐

