Easily create metrics for your application.
β¨ Help support the maintenance of this package by sponsoring me.
Designed to work with Laravel, Filament, Easy enum, and more.
- Bar metric
 - Doughnut metric
 - Line metric
 - Pie metric
 - Polar metric
 - Trend metric
 - Value metric
 
composer require sakanjo/laravel-easy-metrics
use SaKanjo\EasyMetrics\Metrics\Value;
use App\Models\User;
$data = Value::make(User::class)
    ->count();The currently supported aggregate functions to calculate a given column compared to the previous time interval / range
Value::make(User::class)
    ->min('age');Value::make(User::class)
    ->max('age');Value::make(User::class)
    ->sum('age');Value::make(User::class)
    ->average('age');Value::make(User::class)
    ->count();use SaKanjo\EasyMetrics\Metrics\Doughnut;
use App\Models\User;
[$labels, $data] = Doughnut::make(User::class)
    ->count('gender');The currently supported aggregate functions to calculate a given column compared to the previous time interval / range
Doughnut::make(User::class)
    ->min('age', 'gender');Doughnut::make(User::class)
    ->max('age', 'gender');Doughnut::make(User::class)
    ->sum('age', 'gender');Doughnut::make(User::class)
    ->average('age', 'gender');Doughnut::make(User::class)
    ->count('gender');use SaKanjo\EasyMetrics\Metrics\Trend;
use App\Models\User;
[$labels, $data] = Trend::make(User::class)
    ->countByMonths();The currently supported aggregate functions to calculate a given column compared to the previous time interval / range
$trend->minByYears('age'); 
$trend->minByMonths('age'); 
$trend->minByWeeks('age');  
$trend->minByDays('age');  
$trend->minByHours('age');  
$trend->minByMinutes('age');  $trend->maxByYears('age'); 
$trend->maxByMonths('age'); 
$trend->maxByWeeks('age');  
$trend->maxByDays('age');  
$trend->maxByHours('age');  
$trend->maxByMinutes('age');  $trend->sumByYears('age'); 
$trend->sumByMonths('age'); 
$trend->sumByWeeks('age');  
$trend->sumByDays('age');  
$trend->sumByHours('age');  
$trend->sumByMinutes('age');  $trend->averageByYears('age'); 
$trend->averageByMonths('age'); 
$trend->averageByWeeks('age');  
$trend->averageByDays('age');  
$trend->averageByHours('age');  
$trend->averageByMinutes('age');  $trend->countByYears(); 
$trend->countByMonths(); 
$trend->countByWeeks();  
$trend->countByDays();  
$trend->countByHours();  
$trend->countByMinutes();  Bar extends TrendLine extends TrendDoughnut extends PiePolar extends Pie
Every metric class contains a ranges method, that will determine the range of the results based on it's date column.
use SaKanjo\EasyMetrics\Metrics\Trend;
use SaKanjo\EasyMetrics\Metrics\Enums\Range;
use App\Models\User;
Value::make(User::class)
    ->range(30)
    ->ranges([
        15, 30, 365,
        Range::TODAY, // Or 'TODAY'
    ]);Range::TODAYRange::YESTERDAYRange::MTDRange::QTDRange::YTDRange::ALL
Growth rate, expressed as both a value and a percentage, measures the change in a quantity over time, showing the speed of its expansion or contraction in both absolute and relative terms.
use SaKanjo\EasyMetrics\Metrics\Value;
use SaKanjo\EasyMetrics\Enums\GrowthRateType;
use App\Models\User;
[$value, $growth] = Value::make(User::class)
    ->withGrowthRate()
    ->growthRateType(GrowthRateType::Value) // default is `Percentage`
    ->count();use SaKanjo\EasyMetrics\Metrics\Trend;
use App\Models\User;
[$labels, $data, $growth] = Trend::make(User::class)
    ->withGrowthRate()
    ->countByYears();use SaKanjo\EasyMetrics\Metrics\Doughnut;
use App\Models\User;
[$labels, $data, $growth] = Doughnut::make(User::class)
    ->withGrowthRate()
    ->count('gender');GrowthRateType::ValueGrowthRateType::Percentage
You can use the getLabel method to customize the retreived data labels, for example:
<?php
namespace App\Enums;
use SaKanjo\EasyEnum;
enum ExampleEnum: int
{
    use EasyEnum; // Includes getLabel method
    case Active = 0;
    case Disabled = 1;
}<?php
namespace App\Filament\Widgets\Admin;
use App\Models\User;
use Filament\Widgets\ChartWidget;
use SaKanjo\EasyMetrics\Metrics\Trend;
class UsersCountChart extends ChartWidget
{
    protected static ?string $heading = 'Users count trend';
    protected function getData(): array
    {
        [$labels, $data] = Trend::make(User::class)
            ->range($this->filter)
            ->rangesFromOptions($this->getFilters())
            ->countByMonths();
        return [
            'datasets' => [
                [
                    'label' => 'Users',
                    'data' => $data,
                ],
            ],
            'labels' => $labels,
        ];
    }
    protected function getType(): string
    {
        return 'line';
    }
    protected function getFilters(): ?array
    {
        return [
            15 => '15 Months',
            30 => '30 Months',
            60 => '60 Months',
        ];
    }
}Do you like this project? Support it by donating
Click the "π Sponsor" at the top of this repo.
MIT License Β© 2023-PRESENT Salah Kanjo