ThinkPHP 的 `$append` 属性,说白了就是一个开关——它用来配合访问器(获取器)触发计算逻辑。但有个前提:这个开关只在模型实例被正确序列化时才会生效,比如调用 `toArray()`、`toJson()` 或者 API 自动转换。而且,每个你追加的字段,都必须有一个对应命名的 `getXXXAttr()` 方法等着它,否则就是白搭。

ThinkPHP中Model的append属性_追加计算字段到输出数组【技巧】

很多新手以为 `$append` 里写个字段名就能自动出值,其实远没那么简单。它本质上是一个触发机制,让你能在模型输出时动态计算一些额外信息。但坑也不少,我们来逐一拆解。

字段名和获取器必须严格配对

比如你想追加一个 `full_name` 字段,那就得在模型里做两件事:

配对错误是最常见的翻车点,字段名和方法名差一个字母都不行。

注意数据来源是否走模型流程

直接用 `Db::table()->select()` 或 `query()->execute()` 得到的是原生数组,压根不会触发任何获取器,`$append` 自然毫无效果。所以要注意:

避免性能陷阱:别在获取器里查库或发请求

每个追加字段都会在每条记录的 `toArray()` 过程中单独执行一次获取器。假设有 100 条数据,你又加了 3 个 `$append` 字段——那就意味着 300 次函数调用。如果在获取器里再搞个数据库查询,后果可想而知。

静态属性 vs 实例方法:用对场景才不丢字段

`protected $append = [...]` 是全局默认设置,所有 `toArray()` 调用都会生效。而 `$model->append([...])` 是单次覆盖,会清空之前所有追加项。所以:

搞清楚这些,`$append` 才能真正帮你写出干净、高效的代码。

本文转载于:https://www.php.cn/faq/2461696.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。