$append 是模型类的一个属性,用于定义不在数据库表字段中,但需要随模型一起输出的“虚拟字段”。
物理字段:数据库表中真实存在的列(如 id, title)。
虚拟字段:通过逻辑计算出来的属性(如 url, full_name)。
如何使用 $append
要让一个虚拟字段生效,必须满足三个条件:
第一步:在模型中声明追加列表
在你的 Model 类顶部定义 protected $append 数组。
第二步:定义获取器 (Getter)
- namespace app\model;
- use think\Model;
- class Article extends Model
- {
- // 告诉模型:输出时请带上这两个虚拟字段
- protected $append = ['full_url', 'status_text'];
- }
每一个追加的字段,必须对应一个命名规范为 get + 字段名(驼峰) + Attr 的方法。
第三步:转换输出
- // 对应 full_url
- public function getFullUrlAttr($value, $data)
- {
- // $data 包含当前行所有原始数据库字段
- return 'https://example.com/article/' . $data['id'];
- }
- // 对应 status_text
- public function getStatusTextAttr($value, $data)
- {
- $status = [0 => '禁用', 1 => '正常'];
- return $status[$data['status']] ?? '未知';
- }
虚拟字段不会在你直接 dump($model) 对象时显示,它们只会在模型转换为数组或 JSON 时自动触发。
也可以动态追加 (append),查询时临时增加某个字段:
- $article = Article::find(1);
- // 此时 $article 只是对象,看不见 full_url
- $data = $article->toArray();
- // 现在 $data 数组里包含了 'full_url' 和 'status_text'
$append默认是输出全部追加字段,如果不想输出某一个可以:
- $info = Article::find(1);
- return $info->append(['ext_info'])->toArray();
注意事项:
- return $info->hidden(['status_text'])->toArray();
1、必须 toArray或者toJson才会自动追加
2、如果获取器里用了 $data['cid'],但在查询时你用了 field('id, title') 没查 cid,获取器会报错或返回空。
3、不要让 $append 里的名字和数据库真实字段名重复,否则会产生不可预知的覆盖。
示例:
- protected $append = ['url'];
- public function getUrlAttr($value, $data)
- {
- // 如果是外部链接
- if (!empty($data['outlink'])) return $data['outlink'];
- // 如果是自定义路径
- if (!empty($data['custom_path'])) return '/' . $data['custom_path'];
- // 默认生成
- return url('index/detail', ['id' => $data['id']]);
- }



















文章点评