在Laravel中用Eloquent获取被举报用户及关联举报信息
获取被举报用户及对应举报信息的实现方法
下面提供两种适配你现有模型结构的简洁实现方式:
方式一:从用户模型出发,预加载举报数据
利用User模型中已定义的reported关联,直接筛选出有举报记录的用户,并预加载所有关联的举报详情(包括举报者、分类信息):
// 获取所有被举报过的用户,同时加载对应的举报记录、举报者和分类 $reportedUsers = User::whereHas('reported') ->with(['reported' => function ($query) { // 预加载举报记录关联的举报者和分类,避免N+1查询 $query->with(['reporter', 'category']); }]) ->get();
拿到结果后,每个用户对象的reported属性就是该用户收到的所有举报记录集合,可直接遍历使用:
foreach ($reportedUsers as $user) { echo "被举报用户:{$user->name}"; foreach ($user->reported as $report) { echo "举报者:{$report->reporter->name}"; echo "举报分类:{$report->category->name}"; echo "举报内容:{$report->body}"; } }
方式二:从举报模型分组整理数据
如果需要先获取所有举报记录,再按被举报用户分组,可使用以下方式:
// 获取所有举报记录,关联被举报用户、举报者和分类 $allReports = Report::with(['reported', 'reporter', 'category'])->get(); // 按被举报用户ID分组,整理为「用户+对应举报」的结构 $usersWithReports = $allReports->groupBy('reported_id')->map(function ($reportsGroup) { $user = $reportsGroup->first()->reported; $user->reports = $reportsGroup; return $user; });
优化建议
你当前User模型中的reported关联名容易产生歧义(既表示「被举报的用户」又表示「该用户收到的举报」),建议修改关联名提升可读性:
在User模型中修改关联方法:
// 原方法名reported改为reportedReports,明确表示「该用户被举报的记录」 public function reportedReports() { return $this->hasMany('App\Models\Report','reported_id'); }
修改后,查询代码对应调整为:
$reportedUsers = User::whereHas('reportedReports') ->with(['reportedReports' => function ($query) { $query->with(['reporter', 'category']); }]) // 可选:添加被举报次数统计 ->withCount('reportedReports') ->get();
此时用户对象会新增reported_reports_count属性,直接显示该用户被举报的总次数。
内容的提问来源于stack exchange,提问作者gabogabans
相关产品推荐
相关产品推荐

