Laravel模型访问器如何动态计算属性值?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1012个文字,预计阅读时间需要5分钟。
Laravel的访问器(accessor)通过约定命名来生成:
常见错误现象:dd($user->first_name) 输出原始数据库值,但你明明写了 getFirst_nameAttribute 并在里面加了 return strtoupper($value),结果毫无反应。
- 字段是
last_login_at→ 访问器函数名必须是getLastLoginAtAttribute - 字段含数字或缩写(如
api_v2_token)→ 仍按规则转为getApiV2TokenAttribute,不是getApi_v2_tokenAttribute - 如果想对非数据库字段加访问器(比如动态拼接的
full_name),函数名照旧:getFullNameAttribute,但内部不调用$this->attributes['xxx'],而是自己计算
访问器里别直接改 $this->attributes
访问器本质是“读取时计算”,不是“赋值钩子”。在 getXXXAttribute 里给 $this->attributes['xxx'] = ... 赋值,会导致后续再次读取该属性时跳过访问器逻辑(因为属性已存在),结果不一致。
本文共计1012个文字,预计阅读时间需要5分钟。
Laravel的访问器(accessor)通过约定命名来生成:
常见错误现象:dd($user->first_name) 输出原始数据库值,但你明明写了 getFirst_nameAttribute 并在里面加了 return strtoupper($value),结果毫无反应。
- 字段是
last_login_at→ 访问器函数名必须是getLastLoginAtAttribute - 字段含数字或缩写(如
api_v2_token)→ 仍按规则转为getApiV2TokenAttribute,不是getApi_v2_tokenAttribute - 如果想对非数据库字段加访问器(比如动态拼接的
full_name),函数名照旧:getFullNameAttribute,但内部不调用$this->attributes['xxx'],而是自己计算
访问器里别直接改 $this->attributes
访问器本质是“读取时计算”,不是“赋值钩子”。在 getXXXAttribute 里给 $this->attributes['xxx'] = ... 赋值,会导致后续再次读取该属性时跳过访问器逻辑(因为属性已存在),结果不一致。

