'date', 'price' => 'decimal:4', ]; public function asset(): BelongsTo { return $this->belongsTo(\App\Models\Asset::class); } public static function current(int $assetId = null): ?float { $query = static::latest('date'); if ($assetId) { $query->where('asset_id', $assetId); } $latestPrice = $query->first(); return $latestPrice ? $latestPrice->price : null; } public static function forDate(string $date, int $assetId = null): ?float { $query = static::where('date', '<=', $date) ->orderBy('date', 'desc'); if ($assetId) { $query->where('asset_id', $assetId); } $price = $query->first(); return $price ? $price->price : null; } public static function updatePrice(int $assetId, string $date, float $price): self { return static::updateOrCreate( ['asset_id' => $assetId, 'date' => $date], ['price' => $price] ); } public static function history(int $assetId = null, int $limit = 30): Collection { $query = static::orderBy('date', 'desc')->limit($limit); if ($assetId) { $query->where('asset_id', $assetId); } return $query->get(); } }