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

Laravel Eloquent:通过关联ID统计指定订阅者的活跃套餐数量

解决统计指定订阅者活跃套餐数量的问题

看起来你当前的方法逻辑和实际需求不太匹配,我来帮你梳理并修正一下。先明确核心需求:根据指定订阅者,统计他当前所有active = true的套餐数量,结合你给出的数据表结构和示例数据,正确的实现方案如下:

修正后的方法实现

class SubscriberPackage extends Model {
    public function subscriber() {
        return $this->belongsTo(Subscriber::class);
    }
    public function package() {
        return $this->belongsTo(Package::class);
    }

    // 修正后的统计方法:传入订阅者ID,返回其活跃套餐数
    public function countActivePackages(int $subscriberId): int
    {
        // 筛选该订阅者名下,active为true的所有套餐记录并计数
        return self::where([
            'subscriber_id' => $subscriberId,
            'active' => true
        ])->count();
    }
}

原代码存在的问题说明

我帮你梳理下原来的_countActivePackages方法哪里偏离了需求:

  • 方法参数$subscriberPackage是单条套餐记录的ID,但你的需求是统计订阅者的活跃套餐,参数应该换成订阅者ID才合理
  • 原代码用'id' => $subscriberPackage是在查询单条套餐记录是否活跃,完全不是统计该订阅者的所有活跃套餐
  • 数据表中标记活跃的字段是active,但原代码写了'status' => \Common::STATUS_ACTIVE,字段名不匹配会导致查询结果错误
  • whereHas('subscriber')只是过滤掉没有关联订阅者的无效套餐,但没有限定到特定订阅者,这一步其实可以去掉,因为subscriber_id已经明确指定了目标订阅者

更优雅的关联调用方式(可选)

如果你希望通过订阅者实例直接获取活跃套餐数,可以在Subscriber模型中添加关联:

// App\Subscriber.php
class Subscriber extends Model {
    public function activePackages() {
        return $this->hasMany(SubscriberPackage::class)->where('active', true);
    }
}

之后就可以这样调用,代码更直观:

// 假设$subscriber是订阅者实例
$activePackageCount = $subscriber->activePackages()->count();

比如你给出的示例数据中,订阅者ID为1的活跃套餐数就是3,用上面的方法就能得到正确结果。

内容的提问来源于stack exchange,提问作者Mr.Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:07:43