Laravel 使用可变变量访问修改器时如何获取数据库存储的原始值
解决方案
你遇到的问题本质是Laravel Eloquent动态属性解析逻辑的特性:直接通过$object->{动态拼接字符串}的方式访问属性时,部分场景下Laravel不会先查询模型已加载的$attributes数组,而是直接调用对应访问器,因此不会传入数据库存储的原始值。
你可以通过以下几种方式解决:
- 方法1:使用官方提供的
getAttribute方法访问动态属性,该方法会完整走Laravel的属性解析流程,自动传入数据库原始值到访问器参数
这是最稳妥的兼容写法,适用于所有固定、动态属性的访问场景。$name = 'working_time'; $value = $object->getAttribute('used_' . $name); - 方法2:在模型的
$casts属性中注册你的自定义访问器属性,强制Laravel将该属性识别为合法的模型字段,动态访问时会自动加载原始值:// 对应模型类中添加 protected $casts = [ 'used_working_time' => 'integer', // 可根据实际字段类型调整为float、string等 ]; - 方法3:先获取模型所有已加载的属性数组,再取值兜底
$attributes = $object->getAttributes(); $attrName = 'used_' . $name; $value = $attributes[$attrName] ?? $object->$attrName;
注:你定义的
getUsedWorkingTimeAttribute属于访问器(Accessor),修改器(Mutator)指的是setXXXAttribute类型的方法,二者功能不同注意区分。
内容的提问来源于stack exchange,提问作者Gommiboum
相关产品推荐
相关产品推荐

