---
title: "Rozšírenie — Metrics for Laravel | Roundly"
description: "Pridajte podporu trendov pre ďalšiu databázu cez QueryExpression a napájajte metriky z doménových udalostí iných balíkov."
url: https://roundly-consulting.com/sk/open-source/navody/metrics-for-laravel/rozsirenie
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Metrics for Laravel](https://roundly-consulting.com/sk/open-source/navody/metrics-for-laravel.md)

# Rozšírenie

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

```php
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():

```php
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})";
    }
}
```

```php
// 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, ktorý už escapovala gramatika dotazov daného spojenia ("orders"."created\_at") — alebo, ak sa pásmo reportingu líši od pásma aplikácie, výraz poskladaný nad ním z vašej addMinutes(). 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:

```php
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/metrics-for-laravel.md)
