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

