thinkphp 6 中无真正字段映射机制,$map 已废弃;field() 仅改查询键名,访问器+ $append 才能使 toarray() 输出别名,$schema 和 $type 不改字段名,$mapping 仅影响属性赋值不改变序列化结果。

ThinkPHP 6 中没有真正意义上的“字段映射”机制,$map 已被彻底废弃,强行使用只会静默失效——查不到数据、create() 丢字段、toArray() 键名不变,还找不到报错。
field() 是最可靠的一次性字段重命名方式
它直接改 SQL 的 SELECT 子句,不依赖模型配置,也不影响写入逻辑,适合 API 输出兼容、临时字段别名等场景。
- 必须写
AS,id AS "user_id"合法,id user_id会被当成两个字段,PDO 报错SQLSTATE[HY000]: General error - 双引号包裹可保小写,尤其在 MySQL 严格模式或某些 PDO 驱动下:用
'id AS "uid"'而非'id AS uid' - 多个字段用逗号分隔:
->field('id AS "uid", name AS "full_name", created_at AS "createdAt"') - 它只改查询结果数组的键名,不影响模型属性访问(
$user->uid仍无效,得靠访问器)
getAttr() + $append 才能让 toArray() 出现新字段名
想让 $user->toArray() 里有 'order_id' => 123,而不是原始的 'id' => 123,必须组合使用访问器和 $append。
- 定义访问器方法:
public function getOrderIdAttr($value, $data) { return $data['id'] ?? $value; } - 在模型中声明:
protected $append = ['order_id'];(注意:这里写的是别名,不是原字段) - 若不想暴露原字段,加
protected $hidden = ['id']; -
$user->order_id和$user->toArray()['order_id']都能取到值,但$user->getData('order_id')不会触发访问器,返回null - 避免在访问器里做 DB 查询,否则 N+1;也别改
$this->attributes,会干扰脏数据检测
$schema 和 $type 不是字段映射,别混用
$schema 只声明真实数据库字段名和类型,用于写入校验和自动类型转换;$type 控制字段值的类型转换(如 'status' => 'boolean'),二者都不改字段名。
-
$schema的 key 必须是数据库真实字段名,比如'user_name',不能写成'userName' - 设了
protected $schema = ['user_name' => 'string']却读不到userName?因为字段名还是user_name,没配访问器就不可能有驼峰属性 -
$type = ['data' => 'json']不会自动解码 JSON 字段,必须同时配protected $json = ['data']; - 误把
$schema当 Laravel 的$casts,结果字段根本没查出来,还以为是映射失败
表名和字段名不一致时,$table 和 $mapping 最容易被忽略
模型查不到数据,大概率不是映射问题,而是表没对上、字段名被自动转换吃掉了。
- 不显式设
protected $table = 'user';,TP6 默认按类名拼表名(UserModel → user_model),可能静默查错表,返回空数组且无提示 - 数据库字段是
last_login_time,但代码里写$user->lastLoginTime拿不到值?检查是否关闭了fields_strict或环境不一致(CLI 下常失效) -
protected $mapping = ['user_name' => 'userName']仅作用于模型属性赋值后,$user->userName可读,但$user->toArray()默认仍输出'user_name' -
$mapping不支持嵌套字段(如'profile.name'),只认一级键名;大小写敏感,'User_Name'≠'user_name'
真正难的不是怎么配,而是搞清每一层生效边界:SQL 层(field)、模型属性层(getAttr)、序列化层($append)、类型转换层($type + $json)。配错一层,整个链路就断了,而且往往没报错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











