Laravel 8更新pivot中间表报Call to a member function where() on int错误如何解决
问题根因
你的查询构造器调用顺序错误,update() 方法执行后会返回受影响的行数(整数类型),你在整数返回值后调用where()方法自然会触发Call to a member function where() on int错误。
另外你当前写法实际会先更新student_topic_examiner全表所有行的internal_id、external_id字段,你认为的“数据更新成功”只是碰巧你需要修改的行也被覆盖了,这是非常危险的全表操作错误。
修复方案
方案1:调整查询构造器顺序
将where()筛选放在update()之前,先锁定要更新的行再执行更新操作:
DB::table("student_topic_examiner") ->where("roll_number", "=", $request->input('roll_number')) ->update([ "internal_id" => $internal->id, "external_id" => $external->id ]);
方案2:使用Eloquent关联的pivot操作(更符合Laravel最佳实践)
如果你已经定义了Student和Topic/Examiner的多对多关联,可以直接用关联方法操作中间表,避免手写DB查询:
// 示例:Student模型关联定义 public function examiners() { return $this->belongsToMany(Examiner::class, 'student_topic_examiner', 'roll_number', 'internal_id') ->withPivot('external_id', 'topic_id'); } // 更新时直接调用 $student->examiners()->updateExistingPivot($internalId, ['external_id' => $externalId]);
内容的提问来源于stack exchange,提问作者imran
相关产品推荐
相关产品推荐

