QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

Thinkphp

Thinkphp的模型中的$append用法

 shitouadmin  2026-03-22 22:31:40
在模型开发中,我们经常遇到这种需求:数据库里只有 create_time(时间戳),但前端需要 create_time_text(格式化日期);或者数据库只有 content,但我们需要一个自动生成的 summary(摘要)。这时候,$append(追加属性)就是你的秘密武器。

$append 是模型类的一个属性,用于定义不在数据库表字段中,但需要随模型一起输出的“虚拟字段”。
物理字段:数据库表中真实存在的列(如 id, title)。
虚拟字段:通过逻辑计算出来的属性(如 url, full_name)。

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

示例:
  1. protected $append = ['url']; 
  2.  
  3. public function getUrlAttr($value, $data) 
  4.     // 如果是外部链接 
  5.     if (!empty($data['outlink'])) return $data['outlink']; 
  6.      
  7.     // 如果是自定义路径 
  8.     if (!empty($data['custom_path'])) return '/' . $data['custom_path']; 
  9.      
  10.     // 默认生成 
  11.     return url('index/detail', ['id' => $data['id']]); 




¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《Thinkphp的模型中的$append用法》发布于石头博客文章,作者:shitouadmin,如若转载,请注明出处:https://www.pweb123.com/kuangjia/thinkphp/1234.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序