NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

SQL pre zoskupovanie trendov vytvára pre každý databázový driver QueryExpression:

namespace RoundlyConsulting\Metrics\Types\Trend\QueryExpressions;

interface QueryExpression
{
    // SQL that formats $column into the unit's bucket key
    public function toSql(string $unit, string $column): string;

    // SQL that moves the datetime $column by $minutes — re-reads it on the reporting clock
    public function addMinutes(string $column, int $minutes): string;
}

toSql() naformátuje stĺpec na kľúč intervalu danej jednotky; addMinutes() posunie stĺpec na čas reportingu (pozri Časové pásma). Ďalší driver podporíte tak, že implementujete obe metódy a triedu namapujete v config('metrics.trend_drivers') pod názvom drivera spojenia — za behu cez config(['metrics.trend_drivers.oracle' => OracleExpression::class]). Mapa v konfigurácii je jediný register driverov a platí pre triedne trendy aj Metrics::trend():

namespace App\Metrics;

use RoundlyConsulting\Metrics\Exceptions\InvalidUnitException;
use RoundlyConsulting\Metrics\Types\Trend\QueryExpressions\QueryExpression;

final class SqlServerExpression implements QueryExpression
{
    public function toSql(string $unit, string $column): string
    {
        return match ($unit) {
            'DAY' => "CONVERT(char(10), {$column}, 23)",   // Y-m-d
            'MONTH' => "CONVERT(char(7), {$column}, 23)",  // Y-m
            'YEAR' => "CONVERT(char(4), {$column}, 23)",   // Y
            default => throw InvalidUnitException::for($unit),
        };
    }

    public function addMinutes(string $column, int $minutes): string
    {
        return "DATEADD(minute, {$minutes}, {$column})";
    }
}
// config/metrics.php
'trend_drivers' => [
    'mysql' => Mysql::class,
    'mariadb' => Mysql::class,
    'pgsql' => Postgres::class,
    'sqlite' => Sqlite::class,
    'sqlsrv' => App\Metrics\SqlServerExpression::class,
],

$unit je hodnota Unit (MINUTE … YEAR) a $column kvalifikovaný dátumový stĺpec. Kľúče, ktoré vaše SQL vráti, sa musia znak po znaku zhodovať s kľúčmi intervalov na strane PHP (Y-m-d pre dni, Y-m pre mesiace, o-W pre ISO týždne — pozri Trendy): dopĺňanie medzier hľadá každý vygenerovaný interval vo výsledku dotazu a pri nezhode potichu vykáže 0. Pre nepodporované jednotky vyhoďte InvalidUnitException, rovnako ako vstavané výrazy.

Vlastné okná

Vstavané obdobia sa vyhodnocujú cez enum Period. Pre neštandardné okno použite obdobie CUSTOM s explicitným začiatkom a koncom: range(Period::Custom, $start, $end).

Recept: z udalostí do metriky

Metriky čítajú z vašich existujúcich tabuliek, takže doménové udalosti ľubovoľného iného balíka môžu napájať metriku bez ďalšej závislosti — ide o prepojenie vo vašej aplikácii, nie o require balíka. Nasmerujte metriku na model, ktorý udalosť zapisuje, alebo zaznamenajte jednoduché počítadlo a spočítajte ho:

use App\Models\Order;
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Metrics\Facades\Metrics;

// Register a metric over whatever table the events already populate.
Metrics::register('orders_today', fn () => Metrics::value()->count(Order::query())->range('TODAY'));

// Or fan a package's event into your own metrics table, then build a metric over it.
Event::listen(OrderPlaced::class, function (OrderPlaced $event): void {
    MetricEvent::create(['name' => 'order_placed', 'occurred_at' => now()]);
});

Metrics::register('orders_placed', fn () => Metrics::trend()
    ->count(MetricEvent::query()->where('name', 'order_placed'), 'occurred_at')
    ->daily());

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.