Laravel中如何在updateOrCreate方法中使用COALESCE?
解决方法
问题原因
你遇到的错误是因为在updateOrCreate的更新逻辑中,COALESCE(recommendation, ...)里的recommendation被PostgreSQL解析为插入语句VALUES子句中的值,而非现有表行的字段。因此数据库无法在该上下文识别这个列引用。
修复方案1:正确引用表字段并使用参数绑定
修改DB::raw部分,明确指定表名来引用现有行的字段,同时用参数绑定避免SQL注入风险:
ApplicationReviewQuestion::updateOrCreate( [ 'application_review_id' => $review->id, 'number' => $question->number, 'type' => $question->type, 'application_grade_id' => $question->application_grade_id ], [ 'recommendation' => DB::raw("COALESCE(application_review_questions.recommendation, ?)", [$question->recommendation]), // 其他字段按同样方式处理 ] );
这里application_review_questions.recommendation明确指向现有表的字段,参数绑定?和数组[$question->recommendation]确保值被安全解析。
修复方案2:显式判断并更新(无原生SQL)
如果不想使用原生SQL,可以先获取或创建记录,再仅更新NULL字段:
$record = ApplicationReviewQuestion::firstOrNew( [ 'application_review_id' => $review->id, 'number' => $question->number, 'type' => $question->type, 'application_grade_id' => $question->application_grade_id ] ); // 仅当字段为NULL时更新 if (is_null($record->recommendation)) { $record->recommendation = $question->recommendation; } // 其他字段同理处理 $record->save();
这种方式更直观,适合需要复杂条件判断的场景。
内容的提问来源于stack exchange,提问作者vaja sinauridze
相关产品推荐
相关产品推荐

