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

Laravel中如何用updateOrCreate更新或创建ListingPoints记录

Laravel 实现指定记录的更新或创建逻辑

针对你的需求,直接用updateOrCreate需要注意:它的第二个参数是创建新记录时的默认值,同时也是更新已有记录时的覆盖值,但你需要更新时sum_star是累加10而非覆盖,所以得调整逻辑。下面是两种可行的实现方式:

方案1:先尝试更新,无匹配则创建(推荐)

这种方式更直接,适配增量更新字段的场景:

$userRate = \Auth::user()->rate;

// 尝试更新符合条件的记录:设置review_count,sum_star累加10
$updatedRows = ListingPoints::where('ListingPoints', 1)
    ->where('review_cat_id', 1)
    ->update([
        'review_count' => $userRate,
        'sum_star' => \DB::raw('sum_star + 10')
    ]);

// 如果没有记录被更新,说明不存在,创建新记录
if ($updatedRows === 0) {
    ListingPoints::create([
        'ListingPoints' => 1,
        'review_cat_id' => 1,
        'review_count' => $userRate,
        'sum_star' => 10
    ]);
}

方案2:用firstOrNew手动处理逻辑(更直观)

如果你习惯用模型实例操作,可以用firstOrNew分别处理已有记录和新记录:

$userRate = \Auth::user()->rate;

// 查找符合条件的记录,不存在则生成新实例
$listingPoint = ListingPoints::firstOrNew(
    ['ListingPoints' => 1, 'review_cat_id' => 1]
);

// 不管是已有还是新记录,都设置review_count
$listingPoint->review_count = $userRate;

// 区分处理sum_star:已有记录累加10,新记录设为10
if ($listingPoint->exists) {
    $listingPoint->sum_star += 10;
} else {
    $listingPoint->sum_star = 10;
}

// 保存记录
$listingPoint->save();

如果你一定要用updateOrCreate

需要注意:updateOrCreate更新时会覆盖sum_star,所以得在之后修正这个值,逻辑稍显繁琐:

$userRate = \Auth::user()->rate;

// 先执行updateOrCreate:创建时设置正确的sum_star,更新时会把sum_star设为10(后续修正)
$record = ListingPoints::updateOrCreate(
    ['ListingPoints' => 1, 'review_cat_id' => 1],
    ['review_count' => $userRate, 'sum_star' => 10]
);

// 如果是已有记录,把sum_star加回10(刚才被覆盖成10了)
if (!$record->wasRecentlyCreated) {
    $record->sum_star += 10;
    $record->save();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:47:44