'array', 'options' => 'array', ]; public function creator(): BelongsTo { return $this->belongsTo(\App\Models\User::class, 'created_by'); } public function updater(): BelongsTo { return $this->belongsTo(\App\Models\User::class, 'updated_by'); } /** * 점검항목별 연결 파일 (files 테이블 polymorphic) * document_type = 'checklist_template', document_id = this.id * field_key = sub_item_id (e.g. 'cat-1-1') */ public function documents(): MorphMany { return $this->morphMany(File::class, 'document', 'document_type', 'document_id'); } /** * 특정 항목의 파일 조회 */ public function documentsForItem(string $subItemId) { return $this->documents()->where('field_key', $subItemId); } /** * categories JSON에서 모든 sub_item_id 추출 */ public function getAllSubItemIds(): array { $ids = []; foreach ($this->categories ?? [] as $category) { foreach ($category['subItems'] ?? [] as $subItem) { $ids[] = $subItem['id']; } } return $ids; } }