You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:02:50