CakePHP에서는 편집 작업에서 필드가 변경되었는지 어떻게 확인할 수 있나요?

StackOverflow https://stackoverflow.com/questions/115665

  •  02-07-2019
  •  | 
  •  

문제

나는 cacheCounter ~에 CakePHP, 관련 필드에 대한 카운터를 증가시킵니다.

예를 들어 Person 테이블과 Source 테이블이 있습니다.Person.source_id는 소스 테이블의 행에 매핑됩니다.각 사람은 하나의 소스를 가지며, 각 소스에는 사람 행이 없거나 여러 개가 있습니다.

cacheCounter 사람의 소스 값을 변경할 때 잘 작동합니다.증가합니다 Source.Person_Count.시원한.

그러나 증가하면 사람의 대상 소스에 추가되지만 이전 값에서는 제거되지 않습니다.나는 노력했다 updateCacheControl() ~에 afterSave, 그러나 그것은 아무 일도 하지 않았습니다.

그래서 저는 제 모델에 몇 가지 코드를 작성했습니다. afterSave 그러면 소스 source_id를 뺄 수 있지만, 심지어 내가 변경하지도 않았을 때에도 항상 이 작업을 수행했습니다. source_id.(그래서 카운트는 마이너스가 되었습니다.)

내 질문:모델의 필드가 변경되었는지 알 수 있는 방법이 있습니까? CakePHP?

도움이 되었습니까?

해결책

필드의 변경 사항을 모니터링하려면 다른 곳에서는 변경할 필요 없이 모델에서 이 논리를 사용할 수 있습니다.

function beforeSave() {
    $this->recursive = -1;
    $this->old = $this->find(array($this->primaryKey => $this->id));
    if ($this->old){
        $changed_fields = array();
        foreach ($this->data[$this->alias] as $key =>$value) {
            if ($this->old[$this->alias][$key] != $value) {
                $changed_fields[] = $key;
            }
        }
    }
    // $changed_fields is an array of fields that changed
    return true;
}

다른 팁

을 참조하여 알렉산더 몰랜드 답변.

필터 전에 반복하는 대신에 어떻습니까?

$result = array_diff_assoc($this->old[$this->alias],$this->data[$this->alias]);

키와 가치도 얻을 수 있습니다.

편집 보기에서 모니터링하려는 필드에 대해 또 다른 숨겨진 필드를 포함하되 필드 이름 뒤에 "_prev"와 같은 접미사를 추가하고 값을 모니터링하려는 필드의 현재 값으로 설정합니다.그런 다음 컨트롤러의 편집 작업에서 두 ​​필드가 동일하지 않은 경우 조치를 취하세요.예를 들어

echo $form->input('field_to_monitor');
echo $form->hidden('field_to_monitor_prev', array('value'=>$form->value('field_to_monitor')));

편집은 자주 발생하지 않으므로 업데이트하기 전에 또 다른 선택을 하는 것은 별 문제가 아니므로 저장하기 전에 레코드를 가져오고, 저장하고, 편집 양식에 제출한 데이터와 저장하기 전에 db에서 가져온 데이터를 비교하고, 다르다면 뭔가를 하세요.

"저장"이 "영향을 받은 행"을 반환하는 일종의 DBAL 호출을 사용하는지 확인합니다. 일반적으로 이는 마지막 쿼리가 데이터를 변경했는지 여부를 판단할 수 있는 방법입니다.그렇지 않은 경우 UPDATE 문 이후 영향을 받는 행은 0이기 때문입니다.

모든 모델 클래스에서 getAffectedRows()를 호출할 수 있습니다.

클래스 모델에서 :

/**
 * Returns the number of rows affected by the last query
 *
 * @return int Number of rows
 * @access public
 */
    function getAffectedRows() {
        $db =& ConnectionManager::getDataSource($this->useDbConfig);
        return $db->lastAffected();
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top