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
相关产品推荐
相关产品推荐

