From 85ea196abc39b7459b318933ace3d12a0cc2b80d Mon Sep 17 00:00:00 2001 From: "choi.jh" Date: Fri, 14 Nov 2025 17:41:28 +0900 Subject: [PATCH] trafficmonitor init...2 --- app/Models/CommonModel.php | 111 +++++-------------------------------- 1 file changed, 15 insertions(+), 96 deletions(-) diff --git a/app/Models/CommonModel.php b/app/Models/CommonModel.php index bd29a71..a8306a0 100644 --- a/app/Models/CommonModel.php +++ b/app/Models/CommonModel.php @@ -14,7 +14,6 @@ abstract class CommonModel extends Model protected $useSoftDeletes = false; protected $protectFields = true; protected $allowedFields = []; - protected bool $allowEmptyInserts = false; protected bool $updateOnlyChanged = true; @@ -36,9 +35,9 @@ abstract class CommonModel extends Model // Callbacks protected $allowCallbacks = true; - protected $beforeInsert = []; + protected $beforeInsert = ['_cleanNullsForDefaults']; //Field 값이 NULL일 경우 DB Default값 적용용 protected $afterInsert = []; - protected $beforeUpdate = []; + protected $beforeUpdate = ['_cleanNullsForDefaults']; //Field 값이 NULL일 경우 DB Default값 적용용 protected $afterUpdate = []; protected $beforeFind = []; protected $afterFind = []; @@ -64,104 +63,24 @@ abstract class CommonModel extends Model { return $this->useAutoIncrement; } - /** - * Entity 삽입을 처리하고, $useAutoIncrement가 false일 경우 UUID를 자동으로 생성합니다. - * @param object|array $data Entity 객체 또는 데이터 배열 - * @param bool $returnID 삽입 후 ID를 반환할지 여부 (자동 증가 키일 경우 true) - * @return bool|int|string - */ - public function insert($data = null, bool $returnID = true) - { - // 1. 공통 전처리 로직 (예: 모든 모델에 대한 로그 기록, 공통 필드 설정 등) - $data = $this->preProcessData($data); - // 2. PK 자동 할당 로직 - if (!$this->useAutoIncrement) { - $data = $this->ensurePrimaryKey($data); + // 이 훅은 save() 메서드 실행 시 자동으로 호출됩니다. + protected function _cleanNullsForDefaults(array $data): array + { + // $data['data'] 배열에 실제 INSERT/UPDATE 될 데이터가 들어있습니다. + if (!isset($data['data']) || !is_array($data['data'])) { + return $data; } - // 3. BaseModel의 insert 호출 - // 문자열 PK일 경우, $returnID를 false로 넘겨서 ID 반환을 강제하지 않는 것이 좋습니다. - $baseReturn = parent::insert($data, $this->useAutoIncrement); - - // 4. 후처리 및 반환 - if ($this->useAutoIncrement) { - // 정수 PK: BaseModel이 반환한 새로운 ID를 그대로 반환 - return $baseReturn; - } else { - // 문자열 PK: BaseModel의 insert는 성공 시 true/1을 반환. true로 통일하여 반환 - return $baseReturn !== false; - } - } - - /** - * Entity나 데이터 배열을 받아서 필요하다면 Primary Key를 생성하여 할당합니다. - * @param object|array $data - * @return object|array - */ - protected function ensurePrimaryKey($data) - { - $pkName = $this->primaryKey; - $entityData = is_object($data) ? $data->attributes : (array) $data; - - // PK가 설정되어 있지 않은 경우 - if (empty($entityData[$pkName])) { - $newUuid = service('uuid')->uuid4()->toString(); - - if (is_object($data)) { - // Entity 객체일 경우 __set()을 통해 Setter를 호출하며 할당 - $data->$pkName = $newUuid; - } else { - // 배열일 경우 배열에 할당 - $data[$pkName] = $newUuid; + // 데이터 배열을 순회하며 값이 null인 필드를 제거합니다. + foreach ($data['data'] as $key => $value) { + // 이 필드가 Primary Key가 아니면서 (PK는 Update 시 필요) + // 값이 null이면 DB에 명시하지 않도록 배열에서 제거합니다. + if ($key !== $this->primaryKey && $value === null) { + unset($data['data'][$key]); } } + return $data; } - - /** - * 모든 삽입/수정 작업 전 공통 로직을 처리하는 확장 지점. - */ - protected function preProcessData($data) - { - // 예: $data['data']['updated_by'] = session('user_id'); - return $data; - } - - // ****************************************************** - // 2. UPDATE 및 DELETE 확장 - // ****************************************************** - - /** - * BaseModel의 update 메서드를 호출하기 전/후에 공통 로직을 적용하는 확장 지점. - * @param array|int|string|null $id - * @param array|object|null $data - * @return bool - */ - public function update($id = null, $data = null): bool - { - // 1. 업데이트 전 공통 로직 (preUpdate 이벤트) - $data = $this->preProcessData($data); - - // 2. BaseModel의 update 호출 - return parent::update($id, $data); - - // 3. 업데이트 후 공통 로직 (postUpdate 이벤트) - } - - /** - * BaseModel의 delete 메서드를 호출하기 전/후에 공통 로직을 적용하는 확장 지점. - * @param array|int|string|null $id - * @param bool $purge - * @return bool - */ - public function delete($id = null, bool $purge = false): bool - { - // 1. 삭제 전 공통 로직 (preDelete 이벤트) - - // 2. BaseModel의 delete 호출 - return parent::delete($id, $purge); - - // 3. 삭제 후 공통 로직 (postDelete 이벤트) - } }