如何正确选择ThinkPHP字段类型?详细说明各类型用法。
- 内容介绍
- 文章标签
- 相关推荐
本文共计863个文字,预计阅读时间需要4分钟。
type字段类型配置没有选对,最直接的结果是:
type 配置只在模型层生效,Db 类不认
ThinkPHP 的 type 是模型(Model)专属的字段类型转换机制,Db 类(如 Db::table('user')->select())完全忽略它:
模型中写了
protected $type = ['extra' => 'array'],UserModel::find(1)才会自动json_decode-
但
Db::name('user')->where('id', 1)->find()返回的extra始终是原始字符串,不管数据库里存的是 JSON 还是普通文本立即学习“PHP免费学习笔记(深入)”;
如果你混用 Db 和 Model 操作同一张表,别指望
type能全局生效想让 Db 也处理 JSON 字段,得显式调用
json(['extra'])方法type对 MySQL 的JSON类型字段无额外支持,它只管 PHP 层解码逻辑,不干预 SQL 生成
json 和 array 看似都能转数组,但行为完全不同
很多人以为设成 'array' 就能自动处理 JSON 字符串,其实不是:
'array':仅对字段值做json_decode($value, true),不校验合法性,遇到非法 JSON(比如null、空字符串、{key: "val"}缺引号)会返回null或false,且无提示'json':同样走json_decode,但写入时强制json_encode,且模型内部会尝试捕获编码失败(虽然默认不抛异常)实际推荐用
'json',尤其字段明确存 JSON;用'array'容易掩盖数据脏问题若字段可能为
null,读取后必须手动判断:is_array($user->extra) ?: []不要给
'array'字段赋值对象或资源,json_encode会静默失败或报错
type 与数据库字段类型不是一一映射关系
type 是 PHP 层行为定义,和 MySQL 的字段类型(JSON / TEXT / VARCHAR)没有绑定:
- 即使数据库字段是
JSON类型,模型没配$type['data'] = 'json',读出来仍是字符串 - 反过来,字段是
VARCHAR(255)存 JSON 字符串,只要内容合法,配了'json'一样能 decode 成数组 - 真正影响查询能力的是 MySQL 版本和字段类型:
where('data->status', 1)要求字段是JSON类型且 MySQL ≥ 5.7 -
type不解决whereRaw("JSON_CONTAINS(data, '\"admin\"', '$.roles')")这类原生 JSON 查询,它只管“取出来怎么转”
字段类型选错最常被忽略的一点:它不改变数据库存储格式,也不影响查询语法。你配了 'float',但数据库里存的是 '123' 字符串,读出来确实是 float,可一旦这个字段参与 where 条件或排序,MySQL 仍按字符串比较——这时候出问题,跟 type 无关,是数据建模本身的问题。
本文共计863个文字,预计阅读时间需要4分钟。
type字段类型配置没有选对,最直接的结果是:
type 配置只在模型层生效,Db 类不认
ThinkPHP 的 type 是模型(Model)专属的字段类型转换机制,Db 类(如 Db::table('user')->select())完全忽略它:
模型中写了
protected $type = ['extra' => 'array'],UserModel::find(1)才会自动json_decode-
但
Db::name('user')->where('id', 1)->find()返回的extra始终是原始字符串,不管数据库里存的是 JSON 还是普通文本立即学习“PHP免费学习笔记(深入)”;
如果你混用 Db 和 Model 操作同一张表,别指望
type能全局生效想让 Db 也处理 JSON 字段,得显式调用
json(['extra'])方法type对 MySQL 的JSON类型字段无额外支持,它只管 PHP 层解码逻辑,不干预 SQL 生成
json 和 array 看似都能转数组,但行为完全不同
很多人以为设成 'array' 就能自动处理 JSON 字符串,其实不是:
'array':仅对字段值做json_decode($value, true),不校验合法性,遇到非法 JSON(比如null、空字符串、{key: "val"}缺引号)会返回null或false,且无提示'json':同样走json_decode,但写入时强制json_encode,且模型内部会尝试捕获编码失败(虽然默认不抛异常)实际推荐用
'json',尤其字段明确存 JSON;用'array'容易掩盖数据脏问题若字段可能为
null,读取后必须手动判断:is_array($user->extra) ?: []不要给
'array'字段赋值对象或资源,json_encode会静默失败或报错
type 与数据库字段类型不是一一映射关系
type 是 PHP 层行为定义,和 MySQL 的字段类型(JSON / TEXT / VARCHAR)没有绑定:
- 即使数据库字段是
JSON类型,模型没配$type['data'] = 'json',读出来仍是字符串 - 反过来,字段是
VARCHAR(255)存 JSON 字符串,只要内容合法,配了'json'一样能 decode 成数组 - 真正影响查询能力的是 MySQL 版本和字段类型:
where('data->status', 1)要求字段是JSON类型且 MySQL ≥ 5.7 -
type不解决whereRaw("JSON_CONTAINS(data, '\"admin\"', '$.roles')")这类原生 JSON 查询,它只管“取出来怎么转”
字段类型选错最常被忽略的一点:它不改变数据库存储格式,也不影响查询语法。你配了 'float',但数据库里存的是 '123' 字符串,读出来确实是 float,可一旦这个字段参与 where 条件或排序,MySQL 仍按字符串比较——这时候出问题,跟 type 无关,是数据建模本身的问题。

