Laravel中如何按用户与考试ID条件更新指定关联表列?
解决思路
问题核心在于你当前的代码会遍历该用户所有关联的考试记录并更新pivot字段,而你只需要更新当前通过的那一场考试(对应eval_id = $eval->id)的记录。以下是两种可行的修复方案:
方案一:精准筛选目标记录后更新
修改控制器中的代码,在获取关联记录时添加条件,只取出当前考试对应的那条关联:
if($note_theorique >= $eval->point_theorique && $note_pratique >= $eval->point_pratique && $tempspratique->temps <= $eval->temps_maximum){ // 只筛选当前eval对应的关联记录 $targetResult = $stagiaire->resultatfinal()->where('eval_id', $eval->id)->first(); if($targetResult){ $targetResult->pivot->resultat = 1; $targetResult->pivot->save(); } }
方案二:使用Laravel内置的中间表更新方法(更高效)
利用BelongsToMany关联提供的updateExistingPivot方法,直接指定考试ID和要更新的字段,无需先查询关联模型:
if($note_theorique >= $eval->point_theorique && $note_pratique >= $eval->point_pratique && $tempspratique->temps <= $eval->temps_maximum){ // 直接更新指定用户和考试的中间表记录 $stagiaire->resultatfinal()->updateExistingPivot($eval->id, ['resultat' => 1]); }
为什么原代码会更新所有行?
原代码中$stagiaire->resultatfinal会取出该用户在evaluation_pivot表中所有关联的考试记录,循环遍历后自然会把每一条记录的resultat字段都设为1,这就是导致非目标行被修改的原因。
内容的提问来源于stack exchange,提问作者Chrisdev
相关产品推荐
相关产品推荐

