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

Laravel中如何根据登录用户所选分类及子分类查询用户数据

解决方案

一、Eloquent关联实现方案

首先给User模型补充子分类的关联关系,因为你的selections表同时存储了分类和子分类ID:

// User.php
public function subCategories() {
    return $this->belongsToMany(SubCategory::class, 'selections');
}

然后就可以通过当前登录的捐赠者(Donor)的分类/子分类,筛选出匹配的已批准用户:

// 获取当前登录的Donor用户
$donor = auth()->user();

// 筛选匹配的用户
$matchingUsers = User::where('status', 'approved')
    ->where('id', '!=', $donor->id) // 排除当前用户自己
    ->where(function ($query) use ($donor) {
        // 匹配共同分类
        $query->whereHas('categories', function ($q) use ($donor) {
            $q->whereIn('categories.id', $donor->categories->pluck('id'));
        })
        // 匹配共同子分类
        ->orWhereHas('subCategories', function ($q) use ($donor) {
            $q->whereIn('sub_categories.id', $donor->subCategories->pluck('id'));
        });
    })
    ->paginate(6);

二、查询构建器修改方案

你的原有查询没有限定当前用户的分类范围,所以返回了所有关联结果。修改后可以精准筛选:

$donorId = auth()->id();

$matchingUsers = DB::table('users')
    ->select('users.*')
    // 关联当前用户的选择记录
    ->join('selections as donor_sel', 'donor_sel.user_id', '=', $donorId)
    // 关联目标用户的选择记录,匹配分类或子分类
    ->join('selections as target_sel', function ($join) {
        $join->on('target_sel.category_id', '=', 'donor_sel.category_id')
             ->orOn('target_sel.sub_category_id', '=', 'donor_sel.sub_category_id');
    })
    ->where('users.id', '=', 'target_sel.user_id')
    ->where('users.status', 'approved')
    ->where('users.id', '!=', $donorId) // 排除自己
    ->distinct() // 去重,避免同一用户因多匹配项重复出现
    ->paginate(6);

额外建议

虽然你暂时没法修改数据库架构,但后续重构时,建议把title、description、donation_amount这些字段从users表拆分到单独的表(比如user_profiles或donation_details),通过一对一关联和users表绑定,这样更符合数据库设计范式,也能避免后续维护的麻烦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:41:13