spatie/laravel-stats

跟踪应用程序统计变化

资助包维护!
spatie
其他

安装: 137,649

依赖者: 2

建议者: 0

安全: 0

星级: 395

关注者: 11

分支: 33

开放问题: 0

2.3.0 2024-03-12 19:47 UTC

This package is auto-updated.

Last update: 2024-09-12 20:54:53 UTC


README

Latest Version on Packagist Tests Total Downloads

此包是一个轻量级的解决方案,用于总结数据库随时间的变化。以下是一个快速示例,我们将跟踪订阅和取消的数量随时间的变化。

首先,您应该创建一个统计类。

use Spatie\Stats\BaseStats;

class SubscriptionStats extends BaseStats {}

然后,当有人订阅时,您可以调用它上的 increase,当有人取消计划时,调用 decrease

SubscriptionStats::increase(); // execute whenever somebody subscribes
SubscriptionStats::decrease() // execute whenever somebody cancels the subscription;

有了这个,您可以查询统计。以下是如何按周获取过去两个月的订阅统计。

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'; // stats will be stored with using name `my-custom-name`
    }
}

步骤 2:调用 increase 和 decrease 或设置一个固定值

接下来,当统计信息应该更改时,您可以调用 increasedecrease。在这种情况下,当有人订阅时,应该调用 increase,当有人取消计划时,调用 decrease

SubscriptionStats::increase(); // execute whenever somebody subscribes
SubscriptionStats::decrease(); // execute whenever somebody cancels the subscription;

除了手动增加和减少统计信息之外,您还可以直接设置它。这对于您的特定统计信息不是由您的应用程序计算,而是存在于其他地方很有用。使用订阅示例,让我们假设订阅存在于其他地方,并且有一个 API 调用来获取计数。

$count = AnAPi::getSubscriptionCount(); 

SubscriptionStats::set($count);

默认情况下,increasedecreaseset 方法假设导致您的统计数据更改的事件是立即发生的。您可以选择将这些方法作为第二个参数传递一个日期时间。您的统计数据更改将记录为在那个时刻发生。

SubscriptionStats::increase(1, $subscription->created_at); 

步骤 3:查询统计数据

有了这些,您可以查询统计数据。您可以获取特定时期的统计数据,并按分钟、小时、天、周、月或年分组。

以下是如何按周获取过去两个月的订阅统计。

$stats = SubscriptionStats::query()
    ->start(now()->subMonths(2))
    ->end(now()->subSecond())
    ->groupByWeek()
    ->get();

这将返回一个包含可转换为数组的 Spatie\Stats\DataPoint 对象的数组。这些对象可以像这样转换为数组

// output of $stats->toArray():
[
    [
        '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_atupdated_at 字段创建一个新表
  • 创建一个模型并添加 HasStats-trait
StatsWriter::for(MyCustomModel::class)->set(123)
StatsWriter::for(MyCustomModel::class, ['custom_column' => '123'])->increase(1)
StatsWriter::for(MyCustomModel::class, ['another_column' => '234'])->decrease(1, now()->subDay())

$stats = StatsQuery::for(MyCustomModel::class)
    ->start(now()->subMonths(2))
    ->end(now()->subSecond())
    ->groupByWeek()
    ->get();
    
// OR

$stats = StatsQuery::for(MyCustomModel::class, ['additional_column' => '123'])
    ->start(now()->subMonths(2))
    ->end(now()->subSecond())
    ->groupByWeek()
    ->get(); 

从 HasMany-关系读取和写入

$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 许可协议 (MIT)。请参阅许可文件获取更多信息。