'datetime', 'request_count' => 'integer', 'is_blocked' => 'boolean', 'headers' => 'array', ]; /** * 关联应用模型 * * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function app() { return $this->belongsTo(OpenApiApp::class, 'app_id', 'app_id'); } /** * 获取限制类型的中文名称 * * @return string */ public function getLimitTypeNameAttribute(): string { return match ($this->limit_type) { 'requests_per_minute' => '每分钟请求数', 'requests_per_hour' => '每小时请求数', 'requests_per_day' => '每天请求数', 'requests_per_week' => '每周请求数', 'requests_per_month' => '每月请求数', default => $this->limit_type, }; } /** * 获取状态标签 * * @return string */ public function getStatusLabelAttribute(): string { return $this->is_blocked ? '已阻止' : '正常'; } /** * 获取状态颜色 * * @return string */ public function getStatusColorAttribute(): string { return $this->is_blocked ? 'danger' : 'success'; } /** * 按应用ID查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $appId * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByApp($query, string $appId) { return $query->where('app_id', $appId); } /** * 按IP地址查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $ip * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByIp($query, string $ip) { return $query->where('ip_address', $ip); } /** * 按限制类型查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param string $limitType * @return \Illuminate\Database\Eloquent\Builder */ public function scopeByLimitType($query, string $limitType) { return $query->where('limit_type', $limitType); } /** * 查询被阻止的记录 * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */ public function scopeBlocked($query) { return $query->where('is_blocked', true); } /** * 按时间范围查询 * * @param \Illuminate\Database\Eloquent\Builder $query * @param \Carbon\Carbon $start * @param \Carbon\Carbon $end * @return \Illuminate\Database\Eloquent\Builder */ public function scopeInTimeRange($query, $start, $end) { return $query->whereBetween('window_start', [$start, $end]); } /** * 获取最近的限制记录 * * @param \Illuminate\Database\Eloquent\Builder $query * @param int $hours * @return \Illuminate\Database\Eloquent\Builder */ public function scopeRecent($query, int $hours = 24) { return $query->where('window_start', '>=', now()->subHours($hours)); } }