You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:09:02