TCA类型为json的字段,PHP模型中应定义何种正确类型?
正确的Model属性类型配置方案
你的数据库字段是json类型,对应的Model属性应该定义为array类型,但必须配合Laravel的$casts属性做自动序列化/反序列化处理,这才是解决你遇到问题的关键。
具体操作步骤:
添加
$casts配置到Model
在你的Model类中新增$casts数组,明确指定question_options字段对应array类型:protected $casts = [ 'question_options' => 'array', ];修正属性类型注释
属性的@var标注直接写array即可,因为$casts会自动把数据库里的JSON字符串转换成PHP数组,保存时再自动转回JSON:/** * questionOptions * * @var array */ protected $questionOptions;
为什么之前的方式出问题:
- 只定义
array类型但没加$casts:Laravel不会自动把数据库中的JSON字符串反序列化为PHP数组,读取时自然会显示null或者原始的JSON字符串,导致异常。 - 用
string类型:设置数组值时,Laravel会把数组当作普通字符串处理,要么转成"Array"这种无效内容,要么给JSON字符串额外添加转义符,导致存储的数据不符合预期。
注意事项:
如果你的Model自定义了访问器(getter)或修改器(setter),要确保这些方法的逻辑和$casts的自动处理不冲突——比如不要在setter里手动序列化数组,$casts已经帮你做了这件事。
内容的提问来源于stack exchange,提问作者Doku
相关产品推荐
相关产品推荐

