Skip to content

sakanjo/laravel-easy-metrics

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
October 29, 2023 18:21
art
October 19, 2023 22:59
src
October 30, 2023 20:25
October 30, 2023 20:25
October 6, 2023 21:23
October 30, 2023 20:25
October 28, 2023 22:01
October 6, 2023 21:23
October 28, 2023 22:01
October 6, 2023 21:23

Easy metrics banner

Workflow status Laravel v10.x PHP 8.0

πŸ”₯ Easy metrics

Easily create metrics for your application.

✨ Help support the maintenance of this package by sponsoring me.

Designed to work with Laravel, Filament, and more.

Preview

πŸš€ Supported metrics

  • Bar metric
  • Doughnut metric
  • Line metric
  • Pie metric
  • Polar metric
  • Trend metric
  • Value metric

Table of contents

πŸ“¦ Install

composer require sakanjo/laravel-easy-metrics

πŸ¦„ Usage

Value metric

use SaKanjo\EasyMetrics\Metrics\Value;
use App\Models\User;

$data = Value::make(User::class)
    ->count();

Query types

The currently supported aggregate functions to calculate a given column compared to the previous time interval / range

Min
Value::make(User::class)
    ->min('age');
Max
Value::make(User::class)
    ->max('age');
Sum
Value::make(User::class)
    ->sum('age');
Average
Value::make(User::class)
    ->average('age');
Count
Value::make(User::class)
    ->count();

Doughnut metric

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.

Query types

The currently supported aggregate functions to calculate a given column compared to the previous time interval / range

Min
Doughnut::make(User::class)
    ->min('age', 'gender');
Max
Doughnut::make(User::class)
    ->max('age', 'gender');
Sum
Doughnut::make(User::class)
    ->sum('age', 'gender');
Average
Doughnut::make(User::class)
    ->average('age', 'gender');
Count
Doughnut::make(User::class)
    ->count('gender');

Trend metric

use SaKanjo\EasyMetrics\Metrics\Trend;
use App\Models\User;

[$labels, $data] = Trend::make(User::class)
    ->countByMonths();

Query types

The currently supported aggregate functions to calculate a given column compared to the previous time interval / range

Min
$trend->minByYears('age'); 
$trend->minByMonths('age'); 
$trend->minByWeeks('age');  
$trend->minByDays('age');  
$trend->minByHours('age');  
$trend->minByMinutes('age');  
Max
$trend->maxByYears('age'); 
$trend->maxByMonths('age'); 
$trend->maxByWeeks('age');  
$trend->maxByDays('age');  
$trend->maxByHours('age');  
$trend->maxByMinutes('age');  
Sum
$trend->sumByYears('age'); 
$trend->sumByMonths('age'); 
$trend->sumByWeeks('age');  
$trend->sumByDays('age');  
$trend->sumByHours('age');  
$trend->sumByMinutes('age');  
Average
$trend->averageByYears('age'); 
$trend->averageByMonths('age'); 
$trend->averageByWeeks('age');  
$trend->averageByDays('age');  
$trend->averageByHours('age');  
$trend->averageByMinutes('age');  
Count
$trend->countByYears(); 
$trend->countByMonths(); 
$trend->countByWeeks();  
$trend->countByDays();  
$trend->countByHours();  
$trend->countByMinutes();  

Other metrics

  • Bar extends Trend
  • Line extends Trend
  • Doughnut extends Pie
  • Polar extends Pie

Ranges

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'
    ]);

Available custom ranges

  • Range::TODAY
  • Range::YESTERDAY
  • Range::MTD
  • Range::QTD
  • Range::YTD
  • Range::ALL

Growth rates

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.

Using Value metric

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();

Using Trend metric

use SaKanjo\EasyMetrics\Metrics\Trend;
use App\Models\User;

[$labels, $data, $growth] = Trend::make(User::class)
    ->withGrowthRate()
    ->countByYears();

Using Doughnut metric

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');

Available growth rate types

  • GrowthRateType::Value
  • GrowthRateType::Percentage

πŸ”₯ Practical examples

Filamentphp v3 widgets

<?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',
        ];
    }
}

πŸ’– Support the development

Do you like this project? Support it by donating

Click the "πŸ’– Sponsor" at the top of this repo.

©️ Credits

πŸ“„ License

MIT License Β© 2023-PRESENT Salah Kanjo