diff --git a/src/ArrayMetricRepository.php b/src/ArrayMetricRepository.php index 4ea918d..4868779 100644 --- a/src/ArrayMetricRepository.php +++ b/src/ArrayMetricRepository.php @@ -42,7 +42,8 @@ public function add(Measurable $metric): void ), $metric->measurable(), $metric->additional(), - $existing->hour() !== null + $existing->hour() !== null, + $metric->databaseModel(), ); } else { $this->metrics[$key] = $metric; diff --git a/src/Jobs/RecordMetric.php b/src/Jobs/RecordMetric.php index 1ffa270..cff87db 100644 --- a/src/Jobs/RecordMetric.php +++ b/src/Jobs/RecordMetric.php @@ -38,8 +38,9 @@ public function handle(): void fn (Measurable $metric) => $metric->value() ); + $modelClass = $metric->databaseModel(); /** @var \Illuminate\Database\Eloquent\Model $model */ - $model = new DatabaseMetricManager::$model; + $model = new $modelClass; $model->getConnection()->transaction(function () use ($metric, $value, $model) { $instance = $model->newQuery()->firstOrCreate([ diff --git a/src/JsonMeasurableEncoder.php b/src/JsonMeasurableEncoder.php index 22f6f5a..e4b5422 100644 --- a/src/JsonMeasurableEncoder.php +++ b/src/JsonMeasurableEncoder.php @@ -59,6 +59,7 @@ public function decode(string $key, int $value): Measurable measurable: $model, additional: $attributes['additional'] ?? [], hourly: $attributes['hour'] ?? false, + databaseModel: $attributes['databaseModel'] ?? DatabaseMetricManager::$model, ); } } diff --git a/src/Measurable.php b/src/Measurable.php index ab8cbad..21ca976 100644 --- a/src/Measurable.php +++ b/src/Measurable.php @@ -51,4 +51,11 @@ public function measurable(): ?Model; * Get the additional attributes of the metric. */ public function additional(): array; + + /** + * Get the database model of the metric. + * + * @return class-string<\Illuminate\Database\Eloquent\Model> + */ + public function databaseModel(): string; } diff --git a/src/MetricData.php b/src/MetricData.php index f8885a2..0ce0083 100644 --- a/src/MetricData.php +++ b/src/MetricData.php @@ -23,6 +23,8 @@ public function __construct( protected ?Model $measurable = null, protected array $additional = [], protected bool $hourly = false, + /** @var @var class-string<\Illuminate\Database\Eloquent\Model> */ + protected string $databaseModel = DatabaseMetricManager::$model, ) { $this->date ??= new CarbonImmutable; } @@ -98,4 +100,12 @@ public function additional(): array { return $this->additional; } + + /** + * {@inheritDoc} + */ + public function databaseModel(): string + { + return $this->databaseModel; + } } diff --git a/src/PendingMetric.php b/src/PendingMetric.php index 0b28ea0..8123bdf 100644 --- a/src/PendingMetric.php +++ b/src/PendingMetric.php @@ -33,6 +33,12 @@ class PendingMetric */ protected bool $trackHourly = false; + /** + * The database model of the metric. + * @var class-string<\Illuminate\Database\Eloquent\Model> + */ + protected string $databaseModel = DatabaseMetricManager::$model; + /** * Additional attributes to store with the metric. * @@ -96,6 +102,18 @@ public function hourly(): self return $this; } + /** + * Set the measurable model of the metric. + * + * @param class-string<\Illuminate\Database\Eloquent\Model> $model + */ + public function databaseModel(string $databaseModel): self + { + $this->databaseModel = $databaseModel; + + return $this; + } + /** * Set additional attributes to store with the metric. * @@ -130,7 +148,8 @@ public function toMetricData(int $value): Measurable $this->date, $this->measurable, $this->additional, - $this->trackHourly + $this->trackHourly, + $this->databaseModel, ); } }