Easily create metrics for your application.
β¨ Help support the maintenance of this package by sponsoring me.
Designed to work with Laravel, Filament, 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;
use App\Enums\Gender;
[$labels, $data] = Doughnut::make(User::class)
->options(Gender::class)
->count('gender');
It's always better to use the
options
method even though it's optional, since the retrieved data may not include all enum options.
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 Trend
Line extends Trend
Doughnut extends Pie
Polar 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::TODAY
Range::YESTERDAY
Range::MTD
Range::QTD
Range::YTD
Range::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;
use App\Enums\Gender;
[$labels, $data, $growth] = Doughnut::make(User::class)
->options(Gender::class)
->withGrowthRate()
->count('gender');
GrowthRateType::Value
GrowthRateType::Percentage
<?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