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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:48:38