대량 할당 가능 필드 */ protected $fillable = [ 'url', 'locale', 'layout_name', 'module_identifier', 'type', 'response_time_ms', ]; /** * 속성 캐스팅 정의 * * @return array */ protected function casts(): array { return [ 'created_at' => 'datetime', 'response_time_ms' => 'integer', ]; } /** * 캐시 히트만 조회하는 스코프 * * @param Builder $query 쿼리 빌더 * @return Builder */ public function scopeHits(Builder $query): Builder { return $query->where('type', 'hit'); } /** * 캐시 미스만 조회하는 스코프 * * @param Builder $query 쿼리 빌더 * @return Builder */ public function scopeMisses(Builder $query): Builder { return $query->where('type', 'miss'); } /** * 특정 레이아웃의 통계를 조회하는 스코프 * * @param Builder $query 쿼리 빌더 * @param string $layoutName 레이아웃명 * @return Builder */ public function scopeForLayout(Builder $query, string $layoutName): Builder { return $query->where('layout_name', $layoutName); } /** * 특정 모듈의 통계를 조회하는 스코프 * * @param Builder $query 쿼리 빌더 * @param string $moduleIdentifier 모듈 식별자 * @return Builder */ public function scopeForModule(Builder $query, string $moduleIdentifier): Builder { return $query->where('module_identifier', $moduleIdentifier); } /** * 특정 시점 이후의 통계만 조회하는 스코프 * * @param Builder $query 쿼리 빌더 * @param Carbon $since 기준 시점 * @return Builder */ public function scopeSince(Builder $query, Carbon $since): Builder { return $query->where('created_at', '>=', $since); } }