Skip to content

获取器

获取器用于对模型数据进行处理后再返回,适用于需要格式化展示的场景。

命名规则

获取器的命名规则为getFieldNameAttr,其中FieldName为数据表字段的驼峰转换,Attr为固定后缀。

转换规则

在ThinkPHP框架中,数据表字段名与获取器方法名之间存在明确的命名转换规则:

转换示例

数据表字段名(小写加下划线)获取器方法名(驼峰命名)
status_textgetStatusTextAttr
gender_textgetGenderTextAttr
is_adultgetIsAdultAttr
goods_cover_thumb_smallgetGoodsCoverThumbSmallAttr

转换过程

  1. 将下划线分隔的字段名转换为驼峰命名:

    • status_textStatusText
  2. 添加前缀get和后缀Attr

    • StatusTextgetStatusTextAttr
  3. 在调用获取器时,使用原始的小写加下划线字段名:

    php
    $user = User::find(1);
    echo $user->status_text;

框架内部会自动处理这种命名转换,将字段名转换为对应的获取器方法名并调用。

状态文本获取器

php
/**
 * 获取器:用户状态文本
 * @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']] : '未知';
}

使用方式:

php
$user = User::find(1);
echo $user->status_text;  // 输出:"启用" 或 "禁用"

性别文本获取器

php
/**
 * 获取器:性别文本
 * @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']] : '未知';
}

使用方式:

php
$user = User::find(1);
echo $user->gender_text;  // 输出:"男"、"女" 或 "未知"

业务逻辑获取器

php
/**
 * 获取器:是否成年
 * @param $value
 * @param $data
 * @return bool
 */
public function getIsAdultAttr($value, $data)
{
    return isset($data['age']) && $data['age'] >= 18;
}

使用方式:

php
$user = User::find(1);
if ($user->is_adult) {
    // 执行成年用户相关逻辑
}

封面缩略图获取器

php
/**
 * 获取器:封面缩略图
 */
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 [];
}

使用方式:

php
$field = 'goods_cover';

$list = $this->model->field($field)->append([ 'goods_cover_thumb_small', 'goods_cover_thumb_mid' ])->select()->toArray();

在查询时,数据会自动转换类型,如图所示:

注意

必须查询原有字段,才能进行字段转换,否则会报错

基于 MIT 协议发布