Laravel多对多关联问题:获取指定用户的关联Campaign
问题描述
我有多个Campaign(活动),可分配给多个用户,二者是双向多对多(belongsToMany)关联。需要基于中间表campaign_user,在页面展示仅属于当前指定用户的Campaign结果。
现有模型代码
User模型
public function campaign() { return $this->belongsToMany(Campaign::class, 'campaign_user'); }
Campaign模型(存在错误)
public function users() { return $this->belongsToMany(Gift::class, 'campaign_user'); }
注:这里关联的模型写错了,应替换为
User::class,修正后代码:
public function users() { return $this->belongsToMany(User::class, 'campaign_user'); }
中间表迁移代码
public function up() { Schema::create('campaign_user', function (Blueprint $table) { $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->foreignId('campaign_id')->constrained()->onDelete('cascade'); }); }
错误的控制器代码
public function index(Request $request) { $data = Campaign::withCount('gifts'); $data->where('user_id', $request->user()->id)->get(); return view('subscribes.index', ['data' => $data]); }
错误原因:
Campaign表本身没有user_id字段,直接用where('user_id', ...)无法关联中间表的多对多关系;且调用get()后未将结果重新赋值给$data,原代码中$data仍是查询构建器实例,不是最终数据集合。
修正后的控制器代码
提供两种常用实现方式:
方式一:通过当前用户模型关联查询(推荐)
利用User模型已定义的campaign关联,直接获取当前用户的Campaign并加载gifts数量统计:
public function index(Request $request) { $data = $request->user()->campaign()->withCount('gifts')->get(); return view('subscribes.index', ['data' => $data]); }
方式二:通过Campaign模型关联筛选
使用whereHas方法筛选出关联了当前用户的Campaign:
public function index(Request $request) { $userId = $request->user()->id; $data = Campaign::withCount('gifts') ->whereHas('users', function ($query) use ($userId) { $query->where('user_id', $userId); }) ->get(); return view('subscribes.index', ['data' => $data]); }
补充说明
- 需确保
Campaign模型中已正确定义gifts关联,否则withCount('gifts')会触发报错。 - 两种方式均可正确获取当前用户已订阅的Campaign,方式一更简洁,符合Eloquent关联的使用逻辑。
内容的提问来源于stack exchange,提问作者Hoolis
相关产品推荐
相关产品推荐

