获取器用于对模型数据进行处理后再返回,适用于需要格式化展示的场景。
获取器的命名规则为getFieldNameAttr,其中FieldName为数据表字段的驼峰转换,Attr为固定后缀。
在ThinkPHP框架中,数据表字段名与获取器方法名之间存在明确的命名转换规则:
| 数据表字段名(小写加下划线) | 获取器方法名(驼峰命名) |
|---|---|
status_text |
getStatusTextAttr |
gender_text |
getGenderTextAttr |
is_adult |
getIsAdultAttr |
goods_cover_thumb_small |
getGoodsCoverThumbSmallAttr |
将下划线分隔的字段名转换为驼峰命名:
status_text → StatusText添加前缀get和后缀Attr:
StatusText → getStatusTextAttr在调用获取器时,使用原始的小写加下划线字段名:
$user = User::find(1);
echo $user->status_text;
框架内部会自动处理这种命名转换,将字段名转换为对应的获取器方法名并调用。
/**
* 获取器:用户状态文本
* @param $value
* @param $data
* @return string
*/
public function getStatusTextAttr($value, $data)
{
$status_map = [
0 => '禁用',
1 => '启用'
];
return isset($status_map[$data['status']]) ? $status_map[$data['status']] : '未知';
}
使用方式:
$user = User::find(1);
echo $user->status_text; // 输出:"启用" 或 "禁用"
/**
* 获取器:性别文本
* @param $value
* @param $data
* @return string
*/
public function getGenderTextAttr($value, $data)
{
$gender_map = [
0 => '未知',
1 => '男',
2 => '女'
];
return isset($gender_map[$data['gender']]) ? $gender_map[$data['gender']] : '未知';
}
使用方式:
$user = User::find(1);
echo $user->gender_text; // 输出:"男"、"女" 或 "未知"
/**
* 获取器:是否成年
* @param $value
* @param $data
* @return bool
*/
public function getIsAdultAttr($value, $data)
{
return isset($data['age']) && $data['age'] >= 18;
}
使用方式:
$user = User::find(1);
if ($user->is_adult) {
// 执行成年用户相关逻辑
}
/**
* 获取器:封面缩略图
*/
public function getGoodsCoverThumbSmallAttr($value, $data)
{
if (isset($data[ 'goods_cover' ]) && $data[ 'goods_cover' ] != '') {
return get_thumb_images($data[ 'site_id' ], $data[ 'goods_cover' ], FileDict::SMALL);
}
return [];
}
使用方式:
$field = 'goods_cover';
$list = $this->model->field($field)->append([ 'goods_cover_thumb_small', 'goods_cover_thumb_mid' ])->select()->toArray();
在查询时,数据会自动转换类型,如图所示: 
必须查询原有字段,才能进行字段转换,否则会报错