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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:06:09