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

Laravel中SQL更新转Eloquent遇ORA-00971错误,求关联更新写法

解决Laravel中Oracle更新语句的ORA-00971错误及Eloquent关联更新写法

错误根源

你用DB::select()执行更新语句是完全错误的——select方法只负责执行查询类SQL,更新操作必须用DB::update(),这也是触发ORA-00971错误的核心原因。

原生SQL的正确执行方式

把你的代码改成下面这样即可正常执行:

DB::update('UPDATE services SET services.statement_id = (
    SELECT statements.id
    FROM statements 
    WHERE services.service_ref = statements.statement_ref
)');

Eloquent关联更新写法

首先确保你已经创建了对应的模型并定义好关联关系:

1. 定义模型与关联

在Service模型中添加关联:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Service extends Model
{
    protected $table = 'services';

    // 定义与Statement的关联
    public function statement()
    {
        return $this->belongsTo(Statement::class, 'service_ref', 'statement_ref');
    }
}

在Statement模型中配置基础信息:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Statement extends Model
{
    protected $table = 'statements';
}

2. 两种关联更新实现方式

方式一:JOIN式更新(性能更优,推荐)

通过关联表JOIN直接更新,适合数据量较大的场景:

Service::join('statements', 'services.service_ref', '=', 'statements.statement_ref')
    ->update([
        'services.statement_id' => \DB::raw('statements.id')
    ]);

方式二:子查询赋值

用Eloquent子查询实现和原SQL逻辑一致的更新:

Service::query()
    ->update([
        'statement_id' => Statement::select('id')
            ->whereColumn('statements.statement_ref', 'services.service_ref')
    ]);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:20:41