cakephp3 update를 금지하고 싶다 (insert 한정)
도전
CakePHP는
save()
로 인서트도 업데이트도 실시합니다.엔티티 ID가 있으면 인서트가 없으면 업데이트가 발생합니다.
로그나 프로세스, 스테이터스등을 기록하는 기능으로, 인서트만을 기대하는 DB:테이블에 대해서, 예를 들면 버튼의 연타등에 의한, 「연속 save」로 업데이트가 발생하고 있었습니다.
[03/11 추가]
예를 들어 액세스 로그 등의 경우, 중복된 데이터의 로그를 취할 수 없기 때문에 적합하지 않다는 지적을 받았습니다. 그대로입니다. 주의해 주십시오.
해결책
1. DB측에서 제약을 마련한다(ARCHIVE 스토리지 엔진
2.save시에 $entity->id가 있는지 확인한다
3. cake의 테이블 or 엔티티에서 공통으로 처리
이것이 가능하면 베스트
테이블 또는 엔티티에서 공통으로 처리
애플리케이션 규칙
cake의 테이블 파일로 구현할 수 있는 buildRules 메소드는, save 전에 바리데이션을 걸 수가 있습니다.
업데이트 처리 시 유효성 검사를 항상 false를 반환하도록 시도
/*
* @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
* @return \Cake\ORM\RulesChecker
*/
public function buildRules(RulesChecker $rules)
{
$rules->addUpdate(function($entity, $options) {
return false;
}, 'ruleName');
return $rules;
}
잘 작동했습니다!
※아래 실패 예
/*
* @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
* @return \Cake\ORM\RulesChecker
*/
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->isUnique(['id']));
return $rules;
}
이것은 작동하지 않았습니다. 원래 id는 primary_key로서 독특한 걸 이고...
감사의 말
이 문제는 slack cakephp 공식 팀의 일본 채널에서
상담 받은 것을 정리한 것입니다.
이 자리를 빌려 다시 한번 감사드립니다.
ㅎㅎㅎ 씨, @icchii 씨 감사합니다! !
[CakePHP 공식 일본어 화자용 Slack 채널 개설 안내]
ぃ tp // 코 m/짱 215/있어 ms/3c116171c5308365c314
Reference
이 문제에 관하여(cakephp3 update를 금지하고 싶다 (insert 한정)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ikenji/items/63404023740aa1183306텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)