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
相关产品推荐
相关产品推荐

