Rozšírenie
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 kryptomienOdoslaní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.