Laravel中如何统计列中不同ID的数量并关联展示?
解决Quiz游玩次数统计问题
我来帮你搞定这个统计需求~首先梳理下你的核心诉求:要在quizzes列表的Count列,展示每个Quiz在results表中的游玩次数,没被游玩过的Quiz(比如ID3)要显示0,当前的代码没法正确实现这个效果,我们来一步步修正。
问题分析
你当前的代码$countQuizPlayed = DB::table('results')->pluck('quiz_id')->groupby('quiz_id');得到的是一个分组集合(键为quiz_id,值是对应重复的quiz_id数组),而且视图里的@if($countQuizPlayed = $quiz->id)是赋值操作不是比较判断,既没法正确获取游玩次数,也处理不了未被游玩的Quiz(会显示空值而不是0)。
方案一:用Eloquent关联(最简洁推荐)
假设你已经定义了Quiz和Result模型,先在Quiz模型里建立一对多关联:
// app/Models/Quiz.php class Quiz extends Model { // ... 其他模型代码 public function results() { return $this->hasMany(Result::class, 'quiz_id'); } }
然后在控制器查询allquizzes时,直接用withCount方法自动统计每个Quiz的关联游玩记录数:
// 控制器代码 $allquizzes = \App\Models\Quiz::withCount('results')->get();
最后在视图的Count列直接输出统计值即可,未被游玩的Quiz会自动显示0:
<td>{{ $quiz->results_count }}</td>
方案二:用Query Builder(无模型场景)
如果不想用Eloquent模型,也可以直接用DB查询构造器做左连接统计:
// 控制器代码 $allquizzes = DB::table('quizzes') ->leftJoin('results', 'quizzes.id', '=', 'results.quiz_id') ->select('quizzes.*', DB::raw('COUNT(results.id) as count_played')) ->groupBy('quizzes.id') ->get();
视图里对应输出统计字段:
<td>{{ $quiz->count_played }}</td>
最终视图示例(修正后)
你的quizzes表格可以改成这样:
<thead> <tr> <th>#</th> <th>Name</th> <th>Category</th> <th>Count</th> <th>Sub Category</th> <th>Prepared By</th> <th>Maximum Time</th> <th>Played</th> </tr> </thead> <tbody class="searchable"> @if(count($allquizzes)>0) @foreach($allquizzes as $key=>$quiz) <tr> <td>{{$key+1}}</td> <td>{{$quiz->qname}}</td> <td>{{$quiz->description}}</td> <td>{{ $quiz->results_count ?? $quiz->count_played }}</td> {{-- 根据你用的方案选对应字段 --}} <td>{{$quiz->subcategory}}</td> <td><a href="{{$quiz->profileUrl}}">{{$quiz->by}}</a></td> <td>{{$quiz->minutes}}</td> {{-- 补充你原来未写完的Played列代码即可 --}} </tr> @endforeach @endif </tbody>
这样就能完美实现需求:被游玩过的Quiz显示对应次数,未被游玩的显示0。
内容的提问来源于stack exchange,提问作者Daljit Singh
相关产品推荐
相关产品推荐

