radiatecode / dastats
仪表板或报告的统计信息
Requires
- php: ^7.4 || ^8.0
- ext-json: *
Requires (Dev)
- orchestra/testbench: ^6.18
- phpunit/phpunit: ^9.5
README
此包是记录和查看仪表板或报告统计信息的轻量级解决方案。有时我们需要在仪表板或报告中添加KPI / 指标 / 统计数据,创建这些统计数据需要进行大量的计算、查询等。但是,此包可以帮助您以更优雅的方式生成统计数据,这些统计数据存储在单个数据库表中,因此检索将更快或更简单。
示例
许多仪表板或报告都有统计小部件,例如总客户数、总用户数、总待处理订单、总销售额等。对于这些统计小部件,我们应用了跨表、行的查询以及数学方程来获得单一的统一数值。对于小型数据库,这种方法是可以的,但对于大型数据库,计算可能会损害性能或增加复杂性。那么,如果在CRUD操作期间进行统计计算会怎样呢。
示例 1
总用户计数
每次添加新用户时增加用户,每次删除用户时减少用户。
use RadiateCode\DaStats\Facades\Stats; ....... public function storeUser(Request $request){ // stores statements ............ Stats::title('User count')->key('total-user')->increase(); } public function deleteUser($id){ // delete statements ............ Stats::key('total-user')->decrease(); }
示例 2
总待处理订单
每次添加新待处理订单时增加或计数总待处理订单,每次订单成功交付时减少总待处理订单。
use RadiateCode\DaStats\Facades\Stats; ....... public function orderStore(Request $request){ // pending order placement statements ............ Stats::title('Pending order count')->key('total-pending-order')->increase(); } public function orderDeliver(Request $request){ // order delivery statements ............ Stats::key('total-pending-order')->decrease(); }
示例 3
产品库存
每次购买新产品时增加产品库存,
use RadiateCode\DaStats\Facades\Stats; ....... public function purchaseStore(Request $request){ // other statements ............ foreach($purchaseProducts as $product){ // multiple products // purchase products save statements .............. // increase stock for a product Stats::title('Live stock')->key($product->id)->increase($product->quantity); } }
更新产品库存:有时我们需要更新采购产品数量,例如在同一视图中添加或减去数量,在这种情况下,我们的产品库存也需要相应反映。
use RadiateCode\DaStats\Facades\Stats; ....... public function purchaseUpdate(Request $request){ // other statement ............ foreach($purchaseProducts as $product){ // purchase products update statements .............. .............. //live stock $variation = (int) $newQty - $oldQty; Stats::when($variation > 0,function ($stats) use ($product,$variation){ $stats->title('Live stock')->key($product->id)->increase($variation); }); Stats::when($variation < 0,function ($stats) use ($product,$variation){ $stats->title('Live stock')->key($product->id)->decrease(abs($variation)); }); } }
删除采购产品时减少产品库存。
use RadiateCode\DaStats\Facades\Stats; ....... public function productDelete($id){ // other statement ............ // find product $purchaseProduct = PurchaseProduct::findOrFail($id); // decrese value for this product Stats::title('Live stock')->key($purchaseProduct->id)->decrease($purchaseProduct->quantity); $purchaseProduct->delete(); // purchase product delete }
获取统计数据
上述示例已展示了我们如何通过在数据CRUD操作中放置increase()、decrease()来创建统计。
现在让我们获取或查看我们的统计数据。
$stats = Stats::key('total-pending-order')->find(); $stats = Stats::key('total-user')->find(); $stock = Stats::title('Live stock')->get();
或
$stats = Stats::inKeys('total-pending-order','total-user')->get(); // get stock by product ids $stocks = Stats::inKeys(1,22,55,66)->get();
或
$stats = Stats::contains('pending')->get();
安装
您可以通过composer安装此包
composer require radiatecode/dastats
迁移统计表
php artisan dastats:table
php artisan migrate
您可以选择发布配置文件(可选)
php artisan vendor:publish --provider="RadiateCode\DaStats\StatsServiceProvider" --tag="dastats-config"
用法
统计数据增加
增加指定键和标题的统计数据。
Stats::title('Your Title')->key('your-key')->increase();
默认增加1,但您可以通过传递任何特定的数值。
在内部,increase()检查是否存在给定键和标题的统计数据,如果存在,则增加,如果不存在,则创建新记录。
统计数据减少
减少指定键的统计数据值。
Stats::key('your-key')->decrease();
或
Stats::title('Your Title')->key('your-key')->decrease();
默认减少1(默认值),但您可以减少任何特定的值。
在内部,decrease()检查统计数据的存在性,如果找到,则减少,否则返回null。在减少过程中,如果减少到零,则将从存储中删除统计数据记录。
统计数据替换
在某些情况下,我们需要替换现有的统计数据值,在这些情况下可以使用replace()。
Stats::key('your-key')->replace($value);
或
Stats::title('Your Title')->key('your-key')->replace($value);
通过键获取统计数据
Stats::inKeys('key-1','key-2')->get();
分页
Stats::inKeys('key-1','key-2')->paginate(10);
查找单个统计数据
Stats::title('Title 1')->key('key-1')->find();
或
Stats::key('key-1')->find();
检查统计数据是否存在
Stats::title('Title 1')->key('key-1')->exists(); // return true/false
或
// based on existence do stats operation Stats::title('Title')->key('key-1')->exists( function ($stats){ // if exists $stats->replace(300); },function ($stats){ // if not exists $stats->increase(25); } );
通过包含部分键获取统计数据
Stats::contain('partOfkey')->get(); example: // key name is `total-registered-user` // we can get stats by the key part `registered` Stats::contain('registered')->get();
删除统计数据
$stats = Stats::key('key-1')->remove();
或
Stats::inKeys('key-1','key-2','key-3')->remove();
连接统计数据
将统计数据表与其他数据库表连接
joinWith()
joinWith用于将数据库表与统计数据表连接
Stats::joinWith('products', 'id') // joining products table ->title('inventory') ->get(['products.product_name', 'products.product_unit']);
join()
像常规Laravel db join一样连接任意数量的表
Stats::joinWith('products', 'id') // joining products table ->join('categories','categories.id','=','products.category_id') // join categories table with products ->join('units','units.id','=','products.unit_id') // join units table with products ->title('inventory') ->get(['products.product_name', 'products.product_unit','categories.category_name','units.unit_name']);
注意:get()方法接受一个数组作为参数,其中它执行数据库'select'语句
隔离统计数据
隔离功能对于SaaS应用很有用,某些统计数据可以存储为个人用户、组织或租户。
Stats::isolate('Tenant',101)->title('Total Order')->key('order-count')->increment(); Stats::isolate('Tenant',101)->key('order-count')->find();
或
Stats::isolate('User',202)->title('Complete Project')->key('project-completion')->increment(); Stats::isolate('User',202)->key('project-completion')->find();
条件操作
Stats::when($some_condition,function($stats){ return $stats->title('Title 1')->key('key-1')->increase(8000); });
或
Stats::title('Title 1')->key('key-1') ->when($some_condition, function($stats){ // when condition true return $stats->decrease(2500); },function(){ // when condition false return $stats->increase(500); } );
或
Stats::when($has_tenant,function($stats) use ($tenantId){ return $stats->isolate('Tenant', $tenantId); })->all();
多次增加、减少或替换
对于多次增加或减少,我们可以使用 doMany()
use RadiateCode\DaStats\Enum\StatsAction; ........... // data format $data = [ ['key' => 'key-1','value' = 40], ['key' => 'key-2','value' = 25], ['key' => 'key-3','value' = 35], ] // action (ex: StatsAction::INCREASE, StatsAction::DECREASE, StatsAction::REPLACE) $action = StatsAction::INCREASE Stats::title('Live stock')->doMany($action,$data);
当需要隔离时
// data format $data = [ ['key' => 'key-1','value' = 40], ['key' => 'key-2','value' = 25], ['key' => 'key-3','value' = 35], ] Stats::isolate('Organisation',$organisaiton->id)->title('Live stock')->doMany(StatsAction::INCREASE,$data);
注意:数据格式应遵循示例。
因此,在示例3中,我们看到增加操作是在购买产品循环内使用的,但现在我们可以使用 doMany() 通过传递包含产品ID和数量的数组来执行多次增加。
Stats::title('Live stock')->doMany( StatsAction::INCREASE, [ ['key' => 1,'value' = 500], // key => product id and value => quantity ['key' => 5,'value' = 152], ['key' => 35,'value' = 7569], ['key' => 7,'value' = 900], ['key' => 9,'value' = 25], ] );
任务
有时我们需要将统计数据排队,以便在后台运行而不会延迟用户响应,因此在这种情况下,我们可以使用预定义的任务。
注意:请确保我们已经配置了 Laravel队列 并运行队列工作进程
单个统计数据任务
use RadiateCode\DaStats\Jobs\SingleStatsJob; use RadiateCode\DaStats\Enum\StatsAction; .......... // dispatch the job to increase a stats dispatch(new SingleStatsJob(StatsAction::INCREASE,'Title','key',$value)); or // dispatch the job to decrease a stats dispatch(new SingleStatsJob(StatsAction::DECREASE,'Title','key',$value)); // dispatch the job to replace a stats dispatch(new SingleStatsJob(StatsAction::REPLACE,'Title','key',$value));
多个统计数据任务
use RadiateCode\DaStats\Jobs\MultiStatsJob; use RadiateCode\DaStats\Enum\StatsAction; .......... $data = [ ['key' => 1,'value' = 500], ['key' => 5,'value' = 152], ]; // dispatch the job to decrease multiple stats value dispatch(new MultiStatsJob(StatsAction::DECREASE,'Title',$data));
或
// dispatch the job to increase multiple stats value dispatch(new MultiStatsJob(StatsAction::INCREASE,'Title',$data));
当需要隔离时
use RadiateCode\DaStats\Jobs\MultiStatsJob; use RadiateCode\DaStats\Enum\StatsAction; .......... $data = [ ['key' => 1,'value' = 500], ['key' => 5,'value' = 152], ]; $job = new MultiStatsJob(StatsAction::DECREASE,'Title',$data); $job->withIsolation('Tenant',1001); dispatch($job);
数据库表结构
可用方法
统计数据可以通过 Stats外观 或 new Stats() 类调用
以下是一些可用方法
贡献
请参阅 CONTRIBUTING 以获取详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件 radiate126@gmail.com 而不是使用问题跟踪器。
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅 许可证文件。


