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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:00:27