Laravel多表关联实现:查询用户对特定问题的作答状态
实现模型关联以支持便捷的用户-题目答题查询
看起来你已经搭建好了在线测试门户的核心表结构,现在要通过ORM关联实现像$question->user->answer或$user->question->answer这类便捷查询对吧?我假设你用的是Laravel的Eloquent ORM(毕竟这种链式调用是它的典型风格),下面就一步步帮你设置模型关联,满足你的需求:
第一步:定义模型及基础关联
首先确保你已经创建了对应表的Eloquent模型(遵循Laravel的大驼峰单数命名规范),然后为每个模型添加基础关联:
1. LiveTest 模型
class LiveTest extends Model { // 关联该测试下的所有题目 public function questions() { return $this->hasMany(Question::class); } // 关联参加该测试的所有用户记录 public function userRecords() { return $this->hasMany(LiveTestUser::class); } }
2. Question 模型
class Question extends Model { // 关联所属的测试 public function liveTest() { return $this->belongsTo(LiveTest::class); } // 关联该题的所有用户答题记录 public function liveTestAnswers() { return $this->hasMany(LiveTestAnswer::class); } // 多对多关联到作答过该题的用户,同时携带答题信息 public function users() { return $this->belongsToMany(User::class, 'live_test_answers') ->withPivot('answer_given', 'is_correct'); } // 快捷方法:获取特定用户的答题记录 public function getUserAnswer($userId) { return $this->liveTestAnswers()->where('user_id', $userId)->first(); } }
3. LiveTestUser 模型
class LiveTestUser extends Model { // 关联用户 public function user() { return $this->belongsTo(User::class); } // 关联所属的测试 public function liveTest() { return $this->belongsTo(LiveTest::class); } }
4. LiveTestAnswer 模型
class LiveTestAnswer extends Model { // 关联答题用户 public function user() { return $this->belongsTo(User::class); } // 关联对应的题目 public function question() { return $this->belongsTo(Question::class); } }
5. User 模型(默认的Auth用户模型)
class User extends Authenticatable { // ... 保留原有默认代码 // 关联用户参加的所有测试记录 public function liveTestRecords() { return $this->hasMany(LiveTestUser::class); } // 关联用户所有的答题记录 public function liveTestAnswers() { return $this->hasMany(LiveTestAnswer::class); } // 多对多关联到用户作答过的题目,同时携带答题信息 public function questions() { return $this->belongsToMany(Question::class, 'live_test_answers') ->withPivot('answer_given', 'is_correct'); } // 快捷方法:获取特定题目的答题记录 public function getQuestionAnswer($questionId) { return $this->liveTestAnswers()->where('question_id', $questionId)->first(); } }
第二步:使用关联实现快捷查询
设置好关联后,你就可以轻松实现想要的查询需求了:
场景1:从用户出发,查询特定题目的答题情况
$user = User::find(1); // 方式A:通过多对多关联获取 $question = $user->questions()->find(5); if ($question) { $isCorrect = $question->pivot->is_correct; // 直接拿到是否答对 } else { // 用户未作答过该题目 } // 方式B:通过自定义快捷方法 $answerRecord = $user->getQuestionAnswer(5); if ($answerRecord) { $isCorrect = $answerRecord->is_correct; $userAnswer = $answerRecord->answer_given; // 还能拿到用户提交的答案 } else { // 用户未作答过该题目 }
场景2:从题目出发,查询特定用户的答题情况
$question = Question::find(5); // 方式A:通过多对多关联获取 $user = $question->users()->find(1); if ($user) { $isCorrect = $user->pivot->is_correct; } else { // 该用户未作答过此题 } // 方式B:通过自定义快捷方法 $answerRecord = $question->getUserAnswer(1); if ($answerRecord) { $isCorrect = $answerRecord->is_correct; } else { // 该用户未作答过此题 }
这样设置后,你就能高效地查询特定用户与特定题目之间的答题关系了,完全符合你想要的便捷调用需求~
内容的提问来源于stack exchange,提问作者Sunny Kumar
相关产品推荐
相关产品推荐

