跟踪应用状态变化 - 实时统计数据库动态
Spatie/laravel-stats 是一个轻量级的解决方案,用于实时追踪和总结数据库中数据的变化。以下是一个快速示例,展示如何跟踪订阅与取消订阅的数量。
首先,创建一个统计类:
use Spatie\Stats\BaseStats;
class SubscriptionStats extends BaseStats {}
然后,当有人订阅时调用 increase
方法,当有人取消订阅时调用 decrease
方法。
SubscriptionStats::increase(); // 在订阅发生时执行
SubscriptionStats::decrease(); // 在取消订阅时执行
设置完成后,可以查询统计数据。例如,获取过去两个月内,按周分组的订阅统计信息:
use Spatie\Stats\StatsQuery;
$stats = SubscriptionStats::query()
->start(now()->subMonths(2))
->end(now()->subSecond())
->groupByWeek()
->get();
这将返回一个数组,如下所示:
[
[
'start' => '2020-01-01',
'end' => '2020-01-08',
'value' => 102,
'increments' => 32,
'decrements' => 20,
'difference' => 12,
],
[
'start' => '2020-01-08',
'end' => '2020-01-15',
'value' => 114,
'increments' => 63,
'decrements' => 30,
'difference' => 33,
],
]
支持我们
我们投入大量资源开发一流的开源软件包。您可以购买我们的付费产品以支持我们。详情请访问 官方网站。
我们非常欣赏您从家乡寄来的明信片,告诉我们正在使用的哪个包。您可以在 我们的联系页面 找到我们的地址。所有收到的明信片都会在 我们的虚拟明信片墙上 展出。
安装
通过 Composer 进行安装:
composer require spatie/laravel-stats
发布并运行迁移文件:
php artisan vendor:publish --provider="Spatie\Stats\StatsServiceProvider" --tag="stats-migrations"
php artisan migrate
使用方法
步骤1:创建统计类
首先创建统计类。该类负责配置统计数据的存储方式。默认情况下,无需任何配置。
use Spatie\Stats\BaseStats;
class SubscriptionStats extends BaseStats {}
默认使用类名作为在数据库中存储统计数据的键。若要自定义键名,请使用 getName()
方法。
use Spatie\Stats\BaseStats;
class SubscriptionStats extends BaseStats
{
public function getName() : string{
return 'my-custom-name'; // 使用名称 'my-custom-name' 存储统计
}
}
步骤2:增加或减少统计值,或设置固定值
调用 increase
和 decrease
方法来改变统计值。在这个例子中,当有人订阅时调用 increase
,有人取消订阅时调用 decrease
。
SubscriptionStats::increase(); // 在订阅发生时执行
SubscriptionStats::decrease(); // 在取消订阅时执行
代替手动增加和减少,可以直接设置统计值。这对于统计不在自己应用内计算但存储在别处的情况特别有用。比如,假设订阅信息存储在其他地方,可以通过 API 获取计数。
$count = AnAPi::getSubscriptionCount();
SubscriptionStats::set($count);
默认情况下,increase
,decrease
和 set
方法假定导致统计变化的事件发生在现在。可选地,这些方法的第二个参数可以是日期时间,记录的统计变化会显示为发生在那时。
SubscriptionStats::increase(1, $subscription->created_at);
步骤3:查询统计
有了以上设置后,就可以查询统计。你可以获取特定时间段内的统计,并按照分钟、小时、天、周、月或年来进行分组。
以下是如何获取过去两个月内,按周分组的订阅统计信息的示例:
$stats = SubscriptionStats::query()
->start(now()->subMonths(2))
->end(now()->subSecond())
->groupByWeek()
->get();
这将返回一个包含可遍历 Spatie\Stats\DataPoint
对象的数组。这些对象可以像这样转换为数组:
// $stats 的数组形式:
[
[
'start' => '2020-01-01',
'end' => '2020-01-08',
'value' => 102,
'increments' => 32,
'decrements' => 20,
'difference' => 12,
],
[
'start' => '2020-01-08',
'end' => '2020-01-15',
'value' => 114,
'increments' => 63,
'decrements' => 30,
'difference' => 33,
],
]
应用场景与拓展功能
自定义模型读写
- 创建新表,包含
type (string)
、value (bigint)
、created_at
、updated_at
字段。 - 创建模型并添加
HasStats
特性。
StatsWriter::for(MyCustomModel::class)->set(123)
StatsWriter::for(MyCustomModel::class, ['custom_column' => '123'])->increment(1)
StatsWriter::for(MyCustomModel::class, ['another_column' => '234'])->decrement(1, now()->subDay())
$stats = StatsQuery::for(MyCustomModel::class)
->start(now()->subMonths(2))
->end(now()->subSecond())
->groupByWeek()
->get();
// 或者
$stats = StatsQuery::for(MyCustomModel::class, ['additional_column' => '123'])
->start(now()->subMonths(2))
->end(now()->subSecond())
->groupByWeek()
->get();
关联关系读写
$tenant = Tenant::find(1)
StatsWriter::for($tenant->orderStats(), ['payment_type_column' => 'recurring'])->increment(1)
$stats = StatsQuery::for($tenant->orderStats(), , ['payment_type_column' => 'recurring'])
->start(now()->subMonths(2))
->end(now()->subSecond())
->groupByWeek()
->get();
测试
composer test
更新日志
请查看 更新日志 了解最近的更改。
贡献
请参阅 贡献指南。
安全漏洞
请参考 安全策略 来报告安全漏洞。
许可证
MIT 许可。更多信息请见 许可证文件。