'integer', 'is_active' => 'boolean', 'created_at' => 'datetime', 'updated_at' => 'datetime', 'deleted_at' => 'datetime', ]; protected $hidden = [ 'deleted_by', 'deleted_at', ]; /** * 페이지와 연결된 섹션 관계 목록 (링크 테이블 기반) */ public function sectionRelationships() { return $this->hasMany(EntityRelationship::class, 'parent_id') ->where('parent_type', EntityRelationship::TYPE_PAGE) ->where('child_type', EntityRelationship::TYPE_SECTION) ->orderBy('order_no'); } /** * 페이지와 직접 연결된 필드 관계 목록 (링크 테이블 기반) */ public function fieldRelationships() { return $this->hasMany(EntityRelationship::class, 'parent_id') ->where('parent_type', EntityRelationship::TYPE_PAGE) ->where('child_type', EntityRelationship::TYPE_FIELD) ->orderBy('order_no'); } /** * 페이지에 연결된 섹션들 조회 (링크 테이블 기반) */ public function linkedSections() { return ItemSection::whereIn('id', function ($query) { $query->select('child_id') ->from('entity_relationships') ->where('parent_type', EntityRelationship::TYPE_PAGE) ->where('parent_id', $this->id) ->where('child_type', EntityRelationship::TYPE_SECTION); }); } /** * 페이지에 직접 연결된 필드들 조회 (링크 테이블 기반) */ public function linkedFields() { return ItemField::whereIn('id', function ($query) { $query->select('child_id') ->from('entity_relationships') ->where('parent_type', EntityRelationship::TYPE_PAGE) ->where('parent_id', $this->id) ->where('child_type', EntityRelationship::TYPE_FIELD); }); } /** * 페이지의 모든 관계 목록 조회 (섹션 + 직접 연결된 필드) */ public function allRelationships() { return $this->hasMany(EntityRelationship::class, 'parent_id') ->where('parent_type', EntityRelationship::TYPE_PAGE) ->orderBy('order_no'); } /** * source_table에 해당하는 모델 클래스명 반환 */ public function getTargetModelClass(): ?string { $mapping = [ 'items' => \App\Models\Items\Item::class, ]; return $mapping[$this->source_table] ?? null; } /** * 통합 품목 페이지인지 확인 */ public function isItemPage(): bool { return $this->source_table === 'items'; } /** * 제품 페이지인지 확인 (하위 호환성) */ public function isProductPage(): bool { return $this->source_table === 'products'; } /** * 자재 페이지인지 확인 (하위 호환성) */ public function isMaterialPage(): bool { return $this->source_table === 'materials'; } /** * Product 타입 품목인지 확인 (items 테이블 기준) */ public function isProductType(): bool { return in_array($this->item_type, ['FG', 'PT']); } /** * Material 타입 품목인지 확인 (items 테이블 기준) */ public function isMaterialType(): bool { return in_array($this->item_type, ['SM', 'RM', 'CS']); } }