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

Laravel Cashier统计订阅用户数:遇Subscription类找不到等问题

解决Laravel Cashier订阅用户统计问题

一、直接使用Cashier自带的Subscription模型

你不需要自行创建Subscription类,Laravel Cashier已经内置了该模型,只需引入正确的命名空间即可使用官方文档的方法:

// 引入Cashier的Subscription模型
use Laravel\Cashier\Subscription;

// 统计所有活跃订阅的数量(自动排除过期/无效订阅)
$activeSubscriptions = Subscription::query()->active()->count();

// 如果需要统计唯一订阅用户数(避免同一用户多个订阅重复统计)
$uniqueSubscribedUsers = Subscription::query()->active()->distinct('user_id')->count('user_id');

Cashier的active()方法已经内置逻辑,只会返回未过期、未取消且处于有效状态的订阅,无需额外处理过期判断。

二、通过User模型高效筛选订阅用户

你无法直接在User::all()返回的集合上调用subscribed(),因为该方法是User模型实例的方法,而非集合方法。可以通过在User模型中添加查询范围(Scope),在数据库层面直接筛选订阅用户,避免遍历所有用户:

use Illuminate\Database\Eloquent\Builder;
use Laravel\Cashier\Billable;

class User extends Authenticatable
{
    use Billable; // 确保已引入Cashier的Billable trait

    // 定义查询范围:筛选拥有指定活跃订阅的用户
    public function scopeSubscribed(Builder $query, $subscriptionName = 'default')
    {
        return $query->whereHas('subscriptions', function (Builder $subQuery) use ($subscriptionName) {
            $subQuery->where('name', $subscriptionName)->active();
        });
    }
}

使用方式非常简单,直接通过查询构建器调用:

// 统计订阅了"default"套餐的用户数量
$subscribedUserCount = User::subscribed('default')->count();

这种方式直接在数据库层面完成筛选,比遍历用户集合效率高得多,尤其当用户量较大时优势明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 11:40:15