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

