*/ protected $fillable = [ 'template_id', 'extension_type', 'target_name', 'source_type', 'source_identifier', 'override_target', 'content', 'priority', 'is_active', ]; /** * 캐스팅 * * @return array */ protected function casts(): array { return [ 'extension_type' => LayoutExtensionType::class, 'source_type' => LayoutSourceType::class, 'content' => 'array', 'priority' => 'integer', 'is_active' => 'boolean', ]; } /** * 템플릿 관계 * * @return BelongsTo */ public function template(): BelongsTo { return $this->belongsTo(Template::class); } /** * 활성 확장만 조회 * * @param Builder $query * @return Builder */ public function scopeActive(Builder $query): Builder { return $query->where('is_active', true); } /** * Extension Point 타입만 조회 * * @param Builder $query * @return Builder */ public function scopeExtensionPoints(Builder $query): Builder { return $query->where('extension_type', LayoutExtensionType::ExtensionPoint); } /** * Overlay 타입만 조회 * * @param Builder $query * @return Builder */ public function scopeOverlays(Builder $query): Builder { return $query->where('extension_type', LayoutExtensionType::Overlay); } /** * 특정 출처의 확장만 조회 * * @param Builder $query * @param LayoutSourceType $sourceType * @param string $identifier * @return Builder */ public function scopeBySource(Builder $query, LayoutSourceType $sourceType, string $identifier): Builder { return $query->where('source_type', $sourceType) ->where('source_identifier', $identifier); } /** * 우선순위 순으로 정렬 * * @param Builder $query * @return Builder */ public function scopeOrdered(Builder $query): Builder { return $query->orderBy('priority', 'asc') ->orderBy('source_identifier', 'asc'); } /** * 템플릿 오버라이드만 조회 * * @param Builder $query * @return Builder */ public function scopeTemplateOverrides(Builder $query): Builder { return $query->where('source_type', LayoutSourceType::Template); } /** * 특정 모듈/플러그인에 대한 템플릿 오버라이드 조회 * * @param Builder $query * @param string $overrideTarget 오버라이드 대상 모듈/플러그인 식별자 * @return Builder */ public function scopeOverridingTarget(Builder $query, string $overrideTarget): Builder { return $query->where('override_target', $overrideTarget); } /** * 모듈 출처만 조회 * * @param Builder $query * @return Builder */ public function scopeFromModules(Builder $query): Builder { return $query->where('source_type', LayoutSourceType::Module); } /** * 플러그인 출처만 조회 * * @param Builder $query * @return Builder */ public function scopeFromPlugins(Builder $query): Builder { return $query->where('source_type', LayoutSourceType::Plugin); } }