Laravel多对多关系toggle方法执行后关联状态判断异常问题
Eloquent多对多toggle方法操作状态正确判断方案
- 核心逻辑:
toggle()方法执行后会直接返回本次关联操作的明细结果,不需要额外查询数据库判断关联状态,你在Tinker中看到的返回结构就是官方设计用来判断操作类型的依据。 toggle()返回值固定结构:attached:数组,存储本次操作中成功附加的关联主键IDdetached:数组,存储本次操作中成功移除的关联主键ID
修正后的业务方法代码如下:
public function toggleExerciseToProgram(Program $program, Exercise $exercise) { // 接收toggle操作的返回结果 $toggleResult = $program->exercises()->toggle($exercise->id); // attached数组非空代表本次是附加关联操作 if (!empty($toggleResult['attached'])) { return response()->json([ 'message' => "Exercise {$exercise->name} attached to {$program->name}", 'exercise' => $exercise, 'method' => 'add' ]); } // 走到这里代表detached数组非空,是移除关联操作 return response()->json([ 'message' => "Exercise {$exercise->name} removed from {$program->name}", 'method' => 'remove' ]); }
原写法
$program->exercises($exercise->id)->exists()判断失效的原因:给多对多关联对象传入参数的作用是给关联查询添加ID匹配条件,本质是查询「关联的Exercise表中是否存在对应ID的记录」,只要Exercise记录本身存在,无论是否和当前Program绑定,该查询都会返回true,无法正确识别关联绑定状态。
内容的提问来源于stack exchange,提问作者Riza Khan
相关产品推荐
相关产品推荐

