cakephp3 update를 금지하고 싶다 (insert 한정)

4176 단어 PHPCakePHPcakephp3

도전



CakePHP는 save() 로 인서트도 업데이트도 실시합니다.
엔티티 ID가 있으면 인서트가 없으면 업데이트가 발생합니다.

로그나 프로세스, 스테이터스등을 기록하는 기능으로, 인서트만을 기대하는 DB:테이블에 대해서, 예를 들면 버튼의 연타등에 의한, 「연속 save」로 업데이트가 발생하고 있었습니다.

[03/11 추가]
예를 들어 액세스 로그 등의 경우, 중복된 데이터의 로그를 취할 수 없기 때문에 적합하지 않다는 지적을 받았습니다. 그대로입니다. 주의해 주십시오.

해결책



1. DB측에서 제약을 마련한다(ARCHIVE 스토리지 엔진
  • ARCHIVE 스토리지 엔진은 좋지만 인덱스를 원합니다. 사용한 적 없고 걱정 ....
  • cake의 사양에 맞추기 위해서 DB 구조 괴롭힘이라니...!?
  • 꽤 레코드가 쌓이는 테이블에서 id와 created의 복합 독특한 것은 괜찮습니까?

  • 2.save시에 $entity->id가 있는지 확인한다
  • save 하고 있는 전부 개정인가?.

  • 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

    좋은 웹페이지 즐겨찾기