수정자는 모델의 가장 강력한 세 가지 "도구" 중 하나입니다. 이 글에서는 수정자의 사용법과 몇 가지 주의 사항을 요약하겠습니다.
수정자 정의
수정자의 기능은 모델 객체 데이터가 데이터베이스에 기록되기 전에 필요한 데이터 처리를 수행하는 것입니다. 수정자의 표준 정의는 다음과 같습니다.
public function setFieldNameAttr($value, $data) { // 对value值进行处理 data参数是当前全部数据 // 返回值就是实际要写入数据库的值 return $value; }
여기서 FieldName은 데이터 테이블의 field_name 필드(테이블 필드의 데이터 사양과 수정자 메서드는 사양을 정의합니다. 그렇지 않으면 오류가 발생합니다).
각 수식자는 원칙적으로 해당 필드의 데이터만 처리해야 하지만, 필요한 경우 동시에 여러 필드를 처리하는 것도 허용됩니다.
다음은 예시입니다
public function setBirthdayAttr($value, $data) { // 格式化生日数据 $birthday = strtotime($value); // 根据生日判断年龄 $age = getAgeByBirthday($birthday); // 赋值年龄数据 $this->setAttr('age', $age); return $birthday; } public function setAgeAttr($value,$data) { return floor($value); }
setAttr 메소드를 사용하는 이유는 연령 할당 작업이 별도의 수정자를 거칠 수 있도록 하기 위함입니다. 추가 수식어가 없으면
public function setBirthdayAttr($value, $data) { // 格式化生日数据 $birthday = strtotime($value); // 根据生日判断年龄 $age = getAgeByBirthday($birthday); // 赋值年龄数据 $this->data['age'] = $age; return $birthday; }
로 쓸 수도 있습니다. 모델 내부에 데이터 객체를 할당하면 모델의 내부 속성과 혼동되어 예측할 수 없는 결과가 발생하므로
$this->age = $age;
로 쓰면 안 됩니다. 모델.
특정 수정자에서 다른 필드를 수정할 수 있는 경우 추가로 수정해야 하는 필드 수정자가 할당되어 있어야 함(또는 수정자가 트리거됨)을 기억하세요.
호출 방법
수정자 메소드는 정의 사양에 따라 정의된 후 다음과 같은 상황에서 자동으로 호출됩니다.
·모델 객체
· 모델의 데이터 메소드를 호출하고 두 번째 매개변수로 true를 전달합니다.
·모델의 저장 메소드를 호출하고 배열 데이터를 전달합니다.
모델의 setAttr 메소드를 명시적으로 호출합니다.·
이 필드의 자동 완성을 정의합니다.예를 들어, User 모델은 setPasswordAttr 수정자 메소드를 정의합니다. public function setPasswordAttr($value, $data)
{
return md5($value);
}
$user = User::get(1); $user->password = 'think'; $user->save();
$user = User::get(1); $user->data('password', md5('think')); $user->save();
충돌 방지
많은 개발자는 수정자에 대해 자동 완성 자동(삽입 및 업데이트 포함)을 정의하는 것을 좋아합니다.protected $auto = ['password'];
User::beforeUpdate(function($user) { $user->password = md5('think'); });
User::beforeUpdate(function($user) { $user->data('password', md5('think')); });
자동 유형 변환
수정자가 데이터에 대한 유형 변환만 수행하는 경우 수정자를 정의할 필요가 없으며 필드 유형을 직접 정의하면 됩니다.public function setScoreAttr($value, $data) { return (float) $score; }
protected $type = [ 'score' => 'float', ];
ThinkPHP 입문 튜토리얼
이 많이 있습니다. 누구나 배울 수 있습니다! 이 기사는 https://blog.thinkphp.cn/817548에서 복제되었습니다.
위 내용은 ThinkPHP: 모델을 위한 세 가지 강력한 도구 중 두 번째(수정자)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!