'integer', 'order_no' => 'integer', 'is_template' => 'boolean', 'is_default' => 'boolean', 'created_at' => 'datetime', 'updated_at' => 'datetime', 'deleted_at' => 'datetime', ]; /** * 템플릿만 조회하는 스코프 */ public function scopeTemplates($query) { return $query->where('is_template', true); } /** * 일반 섹션만 조회하는 스코프 (템플릿 제외) */ public function scopeNonTemplates($query) { return $query->where('is_template', false); } protected $hidden = [ 'deleted_by', 'deleted_at', ]; /** * 관련 엔티티(fields, bomItems) 로드 * * entity_relationships 기반이므로 일반 Eloquent load() 대신 사용 * * @return $this */ public function loadRelatedEntities(): self { $this->setRelation('fields', $this->linkedFields()->orderBy('order_no')->get()); $this->setRelation('bomItems', $this->linkedBomItems()->orderBy('id')->get()); return $this; } /** * 섹션과 연결된 필드 관계 목록 (링크 테이블 기반) */ public function fieldRelationships() { return $this->hasMany(EntityRelationship::class, 'parent_id') ->where('parent_type', EntityRelationship::TYPE_SECTION) ->where('child_type', EntityRelationship::TYPE_FIELD) ->orderBy('order_no'); } /** * 섹션과 연결된 BOM 관계 목록 (링크 테이블 기반) */ public function bomRelationships() { return $this->hasMany(EntityRelationship::class, 'parent_id') ->where('parent_type', EntityRelationship::TYPE_SECTION) ->where('child_type', EntityRelationship::TYPE_BOM) ->orderBy('order_no'); } /** * 섹션에 연결된 필드들 조회 (링크 테이블 기반) */ public function linkedFields() { return ItemField::whereIn('id', function ($query) { $query->select('child_id') ->from('entity_relationships') ->where('parent_type', EntityRelationship::TYPE_SECTION) ->where('parent_id', $this->id) ->where('child_type', EntityRelationship::TYPE_FIELD); }); } /** * 섹션에 연결된 BOM 항목들 조회 (링크 테이블 기반) */ public function linkedBomItems() { return ItemBomItem::whereIn('id', function ($query) { $query->select('child_id') ->from('entity_relationships') ->where('parent_type', EntityRelationship::TYPE_SECTION) ->where('parent_id', $this->id) ->where('child_type', EntityRelationship::TYPE_BOM); }); } /** * 이 섹션이 연결된 페이지들 조회 (링크 테이블 기반) */ public function linkedPages() { return ItemPage::whereIn('id', function ($query) { $query->select('parent_id') ->from('entity_relationships') ->where('parent_type', EntityRelationship::TYPE_PAGE) ->where('child_type', EntityRelationship::TYPE_SECTION) ->where('child_id', $this->id); }); } /** * 섹션의 모든 자식 관계 목록 조회 (필드 + BOM) */ public function allChildRelationships() { return $this->hasMany(EntityRelationship::class, 'parent_id') ->where('parent_type', EntityRelationship::TYPE_SECTION) ->orderBy('order_no'); } /** * 섹션의 모든 부모 관계 목록 조회 */ public function allParentRelationships() { return EntityRelationship::where('child_type', EntityRelationship::TYPE_SECTION) ->where('child_id', $this->id); } }