fix: ItemService update() 동적 필드 병합 버그 수정

- 기존 item.options 기반으로 동적 필드 병합하도록 수정
- 일부 필드만 변경 시 나머지 필드가 보존됨
- Item-Master 연동 테스트 완료

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-12-14 00:10:46 +09:00
parent d2bdecf063
commit a486595d07

View File

@@ -429,16 +429,40 @@ public function update(int $id, array $data): Model
throw new BadRequestHttpException(__('error.not_found'));
}
// 동적 필드를 options에 병합
// 동적 필드를 options에 병합 (기존 item의 options 기반)
$dynamicOptions = $this->extractDynamicOptions($data);
if (! empty($dynamicOptions)) {
$existingOptions = $data['options'] ?? [];
$data['options'] = $this->mergeOptionsWithDynamic($existingOptions, $dynamicOptions);
// 기존 options를 배열 형태로 변환 (label → value 맵)
$existingOptionsMap = [];
if (is_array($item->options)) {
foreach ($item->options as $opt) {
if (isset($opt['label'])) {
$existingOptionsMap[$opt['label']] = $opt['value'] ?? '';
}
}
}
// options 정규화
if (isset($data['options'])) {
$data['options'] = $this->normalizeOptions($data['options']);
// 새 동적 필드와 기존 options 병합
if (! empty($dynamicOptions)) {
// 새 동적 필드로 기존 값 덮어쓰기
foreach ($dynamicOptions as $key => $value) {
$existingOptionsMap[$key] = $value;
}
}
// 명시적으로 전달된 options 처리
if (isset($data['options']) && is_array($data['options'])) {
// 배열 형태의 options 병합
foreach ($data['options'] as $opt) {
if (isset($opt['label'])) {
$existingOptionsMap[$opt['label']] = $opt['value'] ?? '';
}
}
}
// 최종 options 설정 (병합된 맵이 비어있지 않으면)
if (! empty($existingOptionsMap)) {
$data['options'] = $this->normalizeOptions($existingOptionsMap);
}
// code 변경 시 중복 체크 (동적 테이블)