Files
sam-api/LOGICAL_RELATIONSHIPS.md

402 lines
10 KiB
Markdown
Raw Normal View History

# 논리적 데이터베이스 관계 문서
> **자동 생성**: 2025-11-28 17:41:00
> **소스**: Eloquent 모델 관계 분석
## 📊 모델별 관계 현황
### boards
**모델**: `App\Models\Boards\Board`
- **customFields()**: hasMany → `board_settings`
- **posts()**: hasMany → `posts`
### board_comments
**모델**: `App\Models\Boards\BoardComment`
- **post()**: belongsTo → `posts`
- **user()**: belongsTo → `users`
- **parent()**: belongsTo → `board_comments`
- **children()**: hasMany → `board_comments`
### board_settings
**모델**: `App\Models\Boards\BoardSetting`
- **board()**: belongsTo → `boards`
### posts
**모델**: `App\Models\Boards\Post`
- **board()**: belongsTo → `boards`
- **comments()**: hasMany → `board_comments`
- **files()**: morphMany → `files`
### post_custom_field_values
**모델**: `App\Models\Boards\PostCustomFieldValue`
- **post()**: belongsTo → `posts`
- **field()**: belongsTo → `board_settings`
### categorys
**모델**: `App\Models\Commons\Category`
- **parent()**: belongsTo → `categories`
- **children()**: hasMany → `categories`
- **products()**: hasMany → `products`
- **categoryFields()**: hasMany → `category_fields`
### category_fields
**모델**: `App\Models\Commons\CategoryField`
- **category()**: belongsTo → `categories`
### category_logs
**모델**: `App\Models\Commons\CategoryLog`
- **category()**: belongsTo → `categories`
### category_templates
**모델**: `App\Models\Commons\CategoryTemplate`
- **category()**: belongsTo → `categories`
### files
**모델**: `App\Models\Commons\File`
- **tenant()**: belongsTo → `tenants`
feat: 파일 저장 시스템 DB 마이그레이션 - enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원 - create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능) - 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants) - FolderSeeder stub 생성 - CURRENT_WORKS.md에 Phase 1 진행상황 문서화 fix: 파일 공유 및 삭제 기능 버그 수정 - ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합 - routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요) - FileShareLink: File, Tenant 클래스 import 추가 - File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용 - FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용 - File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant) refactor: Swagger 문서 정리 - File 태그를 Files로 통합 - FileApi.php의 모든 태그를 Files로 변경 - 구 파일 시스템 라우트 삭제 (prefix 'file') - 구 FileController.php 삭제 - 신규 파일 저장소 시스템으로 완전 통합 fix: 모든 legacy 파일 컬럼 nullable 일괄 처리 - 5개 legacy 컬럼을 한 번에 nullable로 변경 * original_name, file_name, file_name_old (string) * fileable_id, fileable_type (polymorphic) - foreach 루프로 반복 작업 자동화 - 신규/기존 시스템 간 완전한 하위 호환성 확보 fix: legacy 파일 컬럼 nullable 처리 완료 - file_name, file_name_old 컬럼도 nullable로 변경 - 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보 - Legacy: original_name, file_name, file_name_old (nullable) - New: display_name, stored_name (required) fix: original_name 컬럼 nullable 처리 - original_name을 nullable로 변경하여 하위 호환성 유지 - 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능 fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선 - files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by) - ApiResponse::handle() 메시지 로직 개선 (접미사 제거) - 다국어 지원을 위한 완성된 문장 구조 유지 - FileUploadRequest 파일 검증 규칙 수정 fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성 - FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant) - FileStorageController use 문 구문 오류 수정 (/ → \) - TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가 - 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반) - 에러 처리 및 로깅 - 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
- **folder()**: belongsTo → `folders`
- **uploader()**: belongsTo → `users`
feat: 파일 저장 시스템 DB 마이그레이션 - enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원 - create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능) - 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants) - FolderSeeder stub 생성 - CURRENT_WORKS.md에 Phase 1 진행상황 문서화 fix: 파일 공유 및 삭제 기능 버그 수정 - ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합 - routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요) - FileShareLink: File, Tenant 클래스 import 추가 - File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용 - FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용 - File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant) refactor: Swagger 문서 정리 - File 태그를 Files로 통합 - FileApi.php의 모든 태그를 Files로 변경 - 구 파일 시스템 라우트 삭제 (prefix 'file') - 구 FileController.php 삭제 - 신규 파일 저장소 시스템으로 완전 통합 fix: 모든 legacy 파일 컬럼 nullable 일괄 처리 - 5개 legacy 컬럼을 한 번에 nullable로 변경 * original_name, file_name, file_name_old (string) * fileable_id, fileable_type (polymorphic) - foreach 루프로 반복 작업 자동화 - 신규/기존 시스템 간 완전한 하위 호환성 확보 fix: legacy 파일 컬럼 nullable 처리 완료 - file_name, file_name_old 컬럼도 nullable로 변경 - 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보 - Legacy: original_name, file_name, file_name_old (nullable) - New: display_name, stored_name (required) fix: original_name 컬럼 nullable 처리 - original_name을 nullable로 변경하여 하위 호환성 유지 - 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능 fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선 - files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by) - ApiResponse::handle() 메시지 로직 개선 (접미사 제거) - 다국어 지원을 위한 완성된 문장 구조 유지 - FileUploadRequest 파일 검증 규칙 수정 fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성 - FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant) - FileStorageController use 문 구문 오류 수정 (/ → \) - TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가 - 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반) - 에러 처리 및 로깅 - 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
- **shareLinks()**: hasMany → `file_share_links`
- **fileable()**: morphTo → `(Polymorphic)`
### menus
**모델**: `App\Models\Commons\Menu`
- **parent()**: belongsTo → `menus`
- **children()**: hasMany → `menus`
### tags
**모델**: `App\Models\Commons\Tag`
- **tenant()**: belongsTo → `tenants`
### bom_templates
**모델**: `App\Models\Design\BomTemplate`
- **modelVersion()**: belongsTo → `model_versions`
- **items()**: hasMany → `bom_template_items`
### bom_template_items
**모델**: `App\Models\Design\BomTemplateItem`
- **template()**: belongsTo → `bom_templates`
### design_models
**모델**: `App\Models\Design\DesignModel`
- **versions()**: hasMany → `model_versions`
### model_versions
**모델**: `App\Models\Design\ModelVersion`
- **model()**: belongsTo → `models`
- **bomTemplates()**: hasMany → `bom_templates`
### estimates
**모델**: `App\Models\Estimate\Estimate`
- **modelSet()**: belongsTo → `categories`
- **items()**: hasMany → `estimate_items`
### estimate_items
**모델**: `App\Models\Estimate\EstimateItem`
- **estimate()**: belongsTo → `estimates`
feat: 파일 저장 시스템 DB 마이그레이션 - enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원 - create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능) - 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants) - FolderSeeder stub 생성 - CURRENT_WORKS.md에 Phase 1 진행상황 문서화 fix: 파일 공유 및 삭제 기능 버그 수정 - ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합 - routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요) - FileShareLink: File, Tenant 클래스 import 추가 - File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용 - FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용 - File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant) refactor: Swagger 문서 정리 - File 태그를 Files로 통합 - FileApi.php의 모든 태그를 Files로 변경 - 구 파일 시스템 라우트 삭제 (prefix 'file') - 구 FileController.php 삭제 - 신규 파일 저장소 시스템으로 완전 통합 fix: 모든 legacy 파일 컬럼 nullable 일괄 처리 - 5개 legacy 컬럼을 한 번에 nullable로 변경 * original_name, file_name, file_name_old (string) * fileable_id, fileable_type (polymorphic) - foreach 루프로 반복 작업 자동화 - 신규/기존 시스템 간 완전한 하위 호환성 확보 fix: legacy 파일 컬럼 nullable 처리 완료 - file_name, file_name_old 컬럼도 nullable로 변경 - 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보 - Legacy: original_name, file_name, file_name_old (nullable) - New: display_name, stored_name (required) fix: original_name 컬럼 nullable 처리 - original_name을 nullable로 변경하여 하위 호환성 유지 - 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능 fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선 - files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by) - ApiResponse::handle() 메시지 로직 개선 (접미사 제거) - 다국어 지원을 위한 완성된 문장 구조 유지 - FileUploadRequest 파일 검증 규칙 수정 fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성 - FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant) - FileStorageController use 문 구문 오류 수정 (/ → \) - TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가 - 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반) - 에러 처리 및 로깅 - 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
### file_share_links
**모델**: `App\Models\FileShareLink`
- **file()**: belongsTo → `files`
- **tenant()**: belongsTo → `tenants`
feat: 파일 저장 시스템 DB 마이그레이션 - enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원 - create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능) - 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants) - FolderSeeder stub 생성 - CURRENT_WORKS.md에 Phase 1 진행상황 문서화 fix: 파일 공유 및 삭제 기능 버그 수정 - ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합 - routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요) - FileShareLink: File, Tenant 클래스 import 추가 - File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용 - FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용 - File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant) refactor: Swagger 문서 정리 - File 태그를 Files로 통합 - FileApi.php의 모든 태그를 Files로 변경 - 구 파일 시스템 라우트 삭제 (prefix 'file') - 구 FileController.php 삭제 - 신규 파일 저장소 시스템으로 완전 통합 fix: 모든 legacy 파일 컬럼 nullable 일괄 처리 - 5개 legacy 컬럼을 한 번에 nullable로 변경 * original_name, file_name, file_name_old (string) * fileable_id, fileable_type (polymorphic) - foreach 루프로 반복 작업 자동화 - 신규/기존 시스템 간 완전한 하위 호환성 확보 fix: legacy 파일 컬럼 nullable 처리 완료 - file_name, file_name_old 컬럼도 nullable로 변경 - 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보 - Legacy: original_name, file_name, file_name_old (nullable) - New: display_name, stored_name (required) fix: original_name 컬럼 nullable 처리 - original_name을 nullable로 변경하여 하위 호환성 유지 - 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능 fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선 - files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by) - ApiResponse::handle() 메시지 로직 개선 (접미사 제거) - 다국어 지원을 위한 완성된 문장 구조 유지 - FileUploadRequest 파일 검증 규칙 수정 fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성 - FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant) - FileStorageController use 문 구문 오류 수정 (/ → \) - TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가 - 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반) - 에러 처리 및 로깅 - 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
### folders
**모델**: `App\Models\Folder`
### custom_tabs
**모델**: `App\Models\ItemMaster\CustomTab`
- **columnSetting()**: hasOne → `tab_columns`
### entity_relationships
**모델**: `App\Models\ItemMaster\EntityRelationship`
- **parent()**: morphTo → `(Polymorphic)`
- **child()**: morphTo → `(Polymorphic)`
### item_pages
**모델**: `App\Models\ItemMaster\ItemPage`
- **sectionRelationships()**: hasMany → `entity_relationships`
- **fieldRelationships()**: hasMany → `entity_relationships`
- **allRelationships()**: hasMany → `entity_relationships`
### item_sections
**모델**: `App\Models\ItemMaster\ItemSection`
- **fieldRelationships()**: hasMany → `entity_relationships`
- **bomRelationships()**: hasMany → `entity_relationships`
- **allChildRelationships()**: hasMany → `entity_relationships`
### tab_columns
**모델**: `App\Models\ItemMaster\TabColumn`
- **tab()**: belongsTo → `custom_tabs`
### main_requests
**모델**: `App\Models\MainRequest`
- **flows()**: hasMany → `main_request_flows`
### main_request_flows
**모델**: `App\Models\MainRequestFlow`
- **mainRequest()**: belongsTo → `main_requests`
- **flowable()**: morphTo → `(Polymorphic)`
### materials
**모델**: `App\Models\Materials\Material`
- **receipts()**: hasMany → `material_receipts`
- **lots()**: hasMany → `lots`
- **files()**: morphMany → `files`
### material_inspections
**모델**: `App\Models\Materials\MaterialInspection`
- **receipt()**: belongsTo → `material_receipts`
- **items()**: hasMany → `material_inspection_items`
### material_inspection_items
**모델**: `App\Models\Materials\MaterialInspectionItem`
- **inspection()**: belongsTo → `material_inspections`
### material_receipts
**모델**: `App\Models\Materials\MaterialReceipt`
- **material()**: belongsTo → `materials`
- **inspections()**: hasMany → `material_inspections`
### users
**모델**: `App\Models\Members\User`
- **userTenants()**: hasMany → `user_tenants`
- **userRoles()**: hasMany → `user_roles`
- **userTenant()**: hasOne → `user_tenants`
- **userTenantById()**: hasOne → `user_tenants`
- **tenantsMembership()**: belongsToMany → `tenants`
- **files()**: morphMany → `files`
### user_menu_permissions
**모델**: `App\Models\Members\UserMenuPermission`
- **user()**: belongsTo → `users`
- **menu()**: belongsTo → `menus`
### user_roles
**모델**: `App\Models\Members\UserRole`
- **user()**: belongsTo → `users`
- **tenant()**: belongsTo → `tenants`
- **role()**: belongsTo → `roles`
### user_tenants
**모델**: `App\Models\Members\UserTenant`
- **user()**: belongsTo → `users`
- **tenant()**: belongsTo → `tenants`
### clients
**모델**: `App\Models\Orders\Client`
- **clientGroup()**: belongsTo → `client_groups`
- **orders()**: hasMany → `orders`
### client_groups
**모델**: `App\Models\Orders\ClientGroup`
- **clients()**: hasMany → `clients`
### orders
**모델**: `App\Models\Orders\Order`
- **items()**: hasMany → `order_items`
- **histories()**: hasMany → `order_histories`
- **versions()**: hasMany → `order_versions`
### order_historys
**모델**: `App\Models\Orders\OrderHistory`
- **order()**: belongsTo → `orders`
### order_items
**모델**: `App\Models\Orders\OrderItem`
- **order()**: belongsTo → `orders`
- **components()**: hasMany → `order_item_components`
### order_item_components
**모델**: `App\Models\Orders\OrderItemComponent`
- **orderItem()**: belongsTo → `order_items`
### order_versions
**모델**: `App\Models\Orders\OrderVersion`
- **order()**: belongsTo → `orders`
### permissions
**모델**: `App\Models\Permissions\Permission`
- **tenant()**: belongsTo → `tenants`
### permission_overrides
**모델**: `App\Models\Permissions\PermissionOverride`
- **permission()**: belongsTo → `permissions`
### roles
**모델**: `App\Models\Permissions\Role`
- **tenant()**: belongsTo → `tenants`
- **menuPermissions()**: hasMany → `role_menu_permissions`
- **userRoles()**: hasMany → `user_roles`
### role_menu_permissions
**모델**: `App\Models\Permissions\RoleMenuPermission`
- **role()**: belongsTo → `roles`
- **menu()**: belongsTo → `menus`
### common_codes
**모델**: `App\Models\Products\CommonCode`
- **parent()**: belongsTo → `common_codes`
- **children()**: hasMany → `common_codes`
### parts
**모델**: `App\Models\Products\Part`
- **category()**: belongsTo → `common_codes`
- **partType()**: belongsTo → `common_codes`
### price_historys
**모델**: `App\Models\Products\PriceHistory`
- **clientGroup()**: belongsTo → `client_groups`
### products
**모델**: `App\Models\Products\Product`
- **category()**: belongsTo → `categories`
- **componentLines()**: hasMany → `product_components`
- **parentLines()**: hasMany → `product_components`
- **children()**: belongsToMany → `products`
- **parents()**: belongsToMany → `products`
- **files()**: morphMany → `files`
### product_components
**모델**: `App\Models\Products\ProductComponent`
- **parentProduct()**: belongsTo → `products`
- **product()**: belongsTo → `products`
- **material()**: belongsTo → `materials`
### lots
**모델**: `App\Models\Qualitys\Lot`
- **material()**: belongsTo → `materials`
- **sales()**: hasMany → `lot_sales`
### lot_sales
**모델**: `App\Models\Qualitys\LotSale`
- **lot()**: belongsTo → `lots`
### departments
**모델**: `App\Models\Tenants\Department`
- **parent()**: belongsTo → `departments`
- **children()**: hasMany → `departments`
- **departmentUsers()**: hasMany → `department_user`
- **users()**: belongsToMany → `users`
- **permissionOverrides()**: morphMany → `permission_overrides`
### payments
**모델**: `App\Models\Tenants\Payment`
- **subscription()**: belongsTo → `subscriptions`
### department_users
**모델**: `App\Models\Tenants\Pivots\DepartmentUser`
- **department()**: belongsTo → `departments`
- **user()**: belongsTo → `users`
### plans
**모델**: `App\Models\Tenants\Plan`
- **subscriptions()**: hasMany → `subscriptions`
### setting_field_defs
**모델**: `App\Models\Tenants\SettingFieldDef`
- **tenantSettings()**: hasMany → `tenant_field_settings`
### subscriptions
**모델**: `App\Models\Tenants\Subscription`
- **tenant()**: belongsTo → `tenants`
- **plan()**: belongsTo → `plans`
- **payments()**: hasMany → `payments`
### tenants
**모델**: `App\Models\Tenants\Tenant`
- **plan()**: belongsTo → `plans`
- **subscription()**: belongsTo → `subscriptions`
- **userTenants()**: hasMany → `user_tenants`
- **roles()**: hasMany → `roles`
- **userRoles()**: hasMany → `user_roles`
- **users()**: belongsToMany → `users`
- **files()**: morphMany → `files`
### tenant_field_settings
**모델**: `App\Models\Tenants\TenantFieldSetting`
- **fieldDef()**: belongsTo → `setting_field_defs`
- **optionGroup()**: belongsTo → `tenant_option_groups`
### tenant_option_groups
**모델**: `App\Models\Tenants\TenantOptionGroup`
- **values()**: hasMany → `tenant_option_values`
### tenant_option_values
**모델**: `App\Models\Tenants\TenantOptionValue`
- **group()**: belongsTo → `tenant_option_groups`
### tenant_stat_fields
**모델**: `App\Models\Tenants\TenantStatField`
- **tenant()**: belongsTo → `tenants`
### tenant_user_profiles
**모델**: `App\Models\Tenants\TenantUserProfile`
- **user()**: belongsTo → `users`
- **department()**: belongsTo → `departments`