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

