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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:36:24