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

Laravel 5.6:如何查询用户已通过/未通过的Assessment

解决方案:在Laravel 5.6中实现用户评估状态的关联查询

没问题,我来帮你搞定这个需求!我们只需要给模型搭好关联,再定义针对性的查询方法,就能轻松在视图里用@foreach遍历用户的已通过/未通过评估了。

1. 先完善模型基础关联

首先确保三个模型的关联关系配置正确,这是后续查询的基础:

在 App\User.php 中添加关联

// 用户拥有多条评估尝试记录
public function attempts()
{
    return $this->hasMany(Attempt::class);
}

在 App\Attempt.php 中添加关联

// 尝试记录归属一个用户
public function user()
{
    return $this->belongsTo(User::class);
}

// 尝试记录归属一个评估
public function assessment()
{
    return $this->belongsTo(Assessment::class);
}

在 App\Assessment.php 中添加关联

// 评估拥有多条尝试记录
public function attempts()
{
    return $this->hasMany(Attempt::class);
}

2. 在User模型中定义筛选后的评估关联

接下来直接在User模型里写两个方法,分别获取已通过和未通过的评估集合:

// 获取用户已通过的评估
public function passedAssessments()
{
    return $this->belongsToMany(Assessment::class, 'attempts')
                ->wherePivot('is_passing', true)
                ->withTimestamps(); // 如果你attempts表有时间戳字段就保留,没有可以删掉
}

// 获取用户未通过的评估
public function failedAssessments()
{
    return $this->belongsToMany(Assessment::class, 'attempts')
                ->wherePivot('is_passing', false)
                ->withTimestamps();
}

这里用belongsToMany是因为用户和评估是多对多关系,attempts表作为中间表,通过wherePivot筛选中间表的is_passing字段来区分状态。

3. 在视图中直接遍历使用

先在控制器里预加载关联(避免N+1查询问题):

// 控制器中获取用户并预加载评估数据
$user = User::with('passedAssessments', 'failedAssessments')->find($userId);

然后就可以在视图里轻松遍历了:

{{-- 遍历已通过的评估 --}}
<h3>已通过的评估</h3>
@foreach($user->passedAssessments as $assessment)
    <div>{{ $assessment->name }}</div>
@endforeach

{{-- 遍历未通过的评估 --}}
<h3>未通过的评估</h3>
@foreach($user->failedAssessments as $assessment)
    <div>{{ $assessment->name }}</div>
@endforeach

备选方案:用访问器分组所有评估

如果你想把两种状态的评估放在一个集合里分组管理,也可以用Laravel的访问器实现:

在User.php中添加:

public function getAssessmentsByStatusAttribute()
{
    // 注意控制器里要预加载attempts和对应的assessment:with('attempts.assessment')
    return $this->attempts->groupBy(function($attempt) {
        return $attempt->is_passing ? 'passed' : 'failed';
    })->map(function($group) {
        // 将分组后的尝试记录转换成评估模型集合
        return $group->pluck('assessment');
    });
}

视图里这样使用:

@foreach($user->assessmentsByStatus['passed'] ?? [] as $assessment)
    <div>{{ $assessment->name }}</div>
@endforeach

@foreach($user->assessmentsByStatus['failed'] ?? [] as $assessment)
    <div>{{ $assessment->name }}</div>
@endforeach

这样就完全满足你的遍历需求啦~

内容的提问来源于stack exchange,提问作者Moose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:56:14