Laravel路由参数异常:访问任意问题始终返回id=1的答案
问题排查与修复方案
我一眼就看到了两个关键问题,正是它们导致了你遇到的诡异现象:
1. 控制器方法参数与路由参数不匹配
你的路由exams/{exam}/questions/{question}/answers定义了两个URL参数:{exam}和{question},但AnswerController的index方法只声明了一个参数$question_id:
public function index($question_id){ $answers = Answer::orderBy('id')->where('question_id', $question_id)->get(); return $answers; }
Laravel会按照参数顺序注入值,这就导致:
- 当你访问
/exams/1/questions/5/answers时,$question_id拿到的其实是第一个参数1(也就是exam的ID),而不是你期望的5(question的ID) - 所以你的查询条件变成了
where('question_id', 1),自然永远返回question_id=1的那条答案数据
修复方案:
更新控制器方法,匹配路由的两个参数,或者更优雅地使用路由模型绑定:
// 方式1:直接接收两个参数 public function index($exam_id, $question_id){ $answers = Answer::orderBy('id')->where('question_id', $question_id)->get(); return $answers; } // 方式2:路由模型绑定(推荐,自动校验模型存在性) public function index(Exam $exam, Question $question){ // 这里直接使用修正后的模型关联查询 $answers = $question->answers()->orderBy('id')->get(); return $answers; }
2. Question模型的关联关系外键错误
你的Question模型中,answers关联的外键写错了:
public function answers(){ return $this->hasMany(Answer::class,'answer_id', 'id'); }
这里第二个参数应该是Answer表中关联Question的字段question_id,而不是answer_id(这个字段根本不存在吧?)。正确的写法是:
public function answers(){ // 因为符合Laravel命名规范,甚至可以省略外键参数 return $this->hasMany(Answer::class, 'question_id', 'id'); }
这个错误虽然不是当前返回错误数据的直接原因,但会导致你通过模型关联查询答案时出错,必须修正。
测试验证
完成上述修复后:
- 访问
/exams/1/questions/5/answers,此时控制器会拿到正确的question_id=5,返回对应问题的答案 - 如果访问一个不存在的question ID,使用路由模型绑定的话会直接返回404,避免返回错误数据
内容的提问来源于stack exchange,提问作者Edgar Gc
相关产品推荐
相关产品推荐

