Laravel使用getAttribute访问器后protected $casts类型转换不生效
问题根因
Laravel 旧版访问器(get{Field}Attribute 语法)的执行优先级高于$casts类型转换配置。当你为total字段定义了访问器后,Laravel会跳过预设的array类型转换逻辑,直接将数据库中存储的原始JSON字符串传入访问器的$value参数,因此你拿到的入参不是预期的数组,最终返回结果自然不符合要求。
解决方案
方案1:兼容所有Laravel版本(旧版访问器写法)
在访问器内手动完成JSON到数组的转码,再调用你的自定义处理逻辑:
public function getTotalAttribute($value) { // 手动实现array cast的转码逻辑 $totalArray = json_decode($value, true); return $this->_auth($totalArray); }
方案2:Laravel 9及以上版本(推荐新版访问器写法)
Laravel 9+ 推出的Attribute类定义的访问器会自动应用预先配置的$casts转换规则,无需手动处理转码:
首先引入依赖:
use Illuminate\Database\Eloquent\Casts\Attribute;
改写访问器定义:
protected function total(): Attribute { return Attribute::make( get: fn ($value) => $this->_auth($value), ); }
注意:请确认你自定义的
_auth方法返回值为数组类型,避免最终输出结果不符合预期。
内容的提问来源于stack exchange,提问作者Mary Tan
相关产品推荐
相关产品推荐

