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