Laravel 6.x模型JSON字段别名实现:将profilepicture改为picture
优雅实现Laravel模型JSON字段的字段别名
当然可以!在Laravel 6.x里,咱们完全可以把字段别名的逻辑封装在模型层,不用在控制器里手动处理JSON解析和数组合并,既符合MVC的设计思想,也让代码更整洁易维护。下面给你两种常用的优雅实现方式:
方法一:使用模型访问器(适合仅读取场景)
这种方式适合只需要在读取数据时替换字段名的场景,步骤很简单:
让Laravel自动解析JSON字段
在你的Credential模型里,通过$casts属性把properties列自动转换为数组,这样就不用手动调用json_decode了:class Credential extends Model { protected $casts = [ 'properties' => 'array', ]; }创建自定义访问器返回格式化后的credentials
添加一个访问器方法,专门处理字段别名并返回最终的credentials集合:public function getCredentialsAttribute() { // 复制properties数组 $credentials = $this->properties; // 将profilepicture替换为picture if (isset($credentials['profilepicture'])) { $credentials['picture'] = $credentials['profilepicture']; unset($credentials['profilepicture']); } return $credentials; }简化控制器代码
现在你可以直接在控制器里调用模型的credentials属性,不用再做额外处理:$authResponsePayload = [ 'access_token' => $token, 'credentials' => $credential->credentials, ];
方法二:自定义属性转换类(适合读写双向场景)
如果你的业务需要在写入数据时也处理字段别名(比如前端传picture字段,要自动转成profilepicture存到数据库),自定义Cast类是更合适的选择:
创建自定义Cast类
在app/Casts目录下新建CredentialsCast.php文件(如果没有Casts目录就自己创建):<?php namespace App\Casts; use Illuminate\Contracts\Database\Eloquent\CastsAttributes; class CredentialsCast implements CastsAttributes { // 读取数据时的处理 public function get($model, $key, $value, $attributes) { $properties = json_decode($value, true) ?? []; // 替换字段名:profilepicture → picture if (isset($properties['profilepicture'])) { $properties['picture'] = $properties['profilepicture']; unset($properties['profilepicture']); } return $properties; } // 写入数据时的处理 public function set($model, $key, $value, $attributes) { // 替换字段名:picture → profilepicture(如果前端传了picture) if (isset($value['picture'])) { $value['profilepicture'] = $value['picture']; unset($value['picture']); } return json_encode($value); } }在模型中使用自定义Cast
修改Credential模型的$casts属性,把properties字段关联到咱们的自定义Cast类:class Credential extends Model { protected $casts = [ 'properties' => \App\Casts\CredentialsCast::class, ]; }控制器直接使用
现在不管是读取还是写入,Laravel都会自动处理字段别名,控制器代码同样简化:// 读取场景 $authResponsePayload = [ 'access_token' => $token, 'credentials' => $credential->properties, ]; // 写入场景(比如更新用户信息) $credential->properties = [ 'firstname' => 'Dan', 'lastname' => 'Jones', 'nickname' => 'DJones', 'picture' => 'new-avatar.jpg' // 会自动转成profilepicture存入数据库 ]; $credential->save();
两种方法都能帮你优雅实现需求,你可以根据自己的业务场景选择合适的方式~
内容的提问来源于stack exchange,提问作者Zabs
相关产品推荐
相关产品推荐

