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

Laravel 8多级关联查询:无user_id的payments表如何获取认证用户支付详情

Laravel 8 获取当前认证用户跨表关联支付明细方案

前置要求:确认模型关联已正确定义

  • User模型(路径:app/Models/User.php)添加与Campaign的一对多关联
public function campaigns()
{
    return $this->hasMany(Campaign::class);
}
  • Campaign模型(路径:app/Models/Campaign.php)添加与User的所属关联、与Payment的一对多关联
public function user()
{
    return $this->belongsTo(User::class);
}

public function payments()
{
    return $this->hasMany(Payment::class);
}
  • Payment模型(路径:app/Models/Payment.php)添加与Campaign的所属关联
public function campaign()
{
    return $this->belongsTo(Campaign::class);
}

3种实现方案(按需选择)

方案1:whereHas跨表过滤(推荐,性能最优)

直接对Payment模型做查询,通过关联的campaign表过滤对应用户,返回标准Payment模型集合,支持分页、条件筛选等操作:

// 获取当前用户所有支付明细
$payments = Payment::whereHas('campaign', function ($query) {
    $query->where('user_id', auth()->id());
})->get();

// 如需同时加载关联的活动信息,可加预加载
$payments = Payment::with('campaign')
    ->whereHas('campaign', function ($query) {
        $query->where('user_id', auth()->id());
    })->paginate(15); // 支持分页

该方式仅执行1次关联查询,适合支付明细列表等大数据量场景。


方案2:链式关联获取

通过当前用户关联的活动集合,聚合所有支付明细:

$payments = auth()->user()->load('campaigns.payments')
    ->campaigns
    ->pluck('payments')
    ->flatten();

注意:该方式会先查询用户关联的所有活动,再查询对应活动的支付,查询次数比方案1多1次,返回结果为集合,不支持原生分页,适合小数据量、同时需要用到活动数据的场景。


方案3:定义远程关联(适合高频调用场景)

如果业务中经常需要获取用户的支付数据,可直接在User模型中定义hasManyThrough远程一对多关联,后续调用更简洁:
首先在User模型中添加关联方法:

public function payments()
{
    return $this->hasManyThrough(
        Payment::class,
        Campaign::class,
        'user_id', // campaigns表关联users表的外键
        'campaign_id', // payments表关联campaigns表的外键
        'id', // users表主键
        'id' // campaigns表主键
    );
}

定义后可直接调用,支持所有查询构造器操作:

// 获取所有支付
$payments = auth()->user()->payments;

// 带条件筛选+分页
$successPayments = auth()->user()->payments()
    ->where('status', 'success')
    ->latest()
    ->paginate(15);

内容的提问来源于stack exchange,提问作者Rizwan Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:54:05