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

Laravel 6.x模型JSON字段别名实现:将profilepicture改为picture

优雅实现Laravel模型JSON字段的字段别名

当然可以!在Laravel 6.x里,咱们完全可以把字段别名的逻辑封装在模型层,不用在控制器里手动处理JSON解析和数组合并,既符合MVC的设计思想,也让代码更整洁易维护。下面给你两种常用的优雅实现方式:

方法一:使用模型访问器(适合仅读取场景)

这种方式适合只需要在读取数据时替换字段名的场景,步骤很简单:

  1. 让Laravel自动解析JSON字段
    在你的Credential模型里,通过$casts属性把properties列自动转换为数组,这样就不用手动调用json_decode了:

    class Credential extends Model
    {
        protected $casts = [
            'properties' => 'array',
        ];
    }
    
  2. 创建自定义访问器返回格式化后的credentials
    添加一个访问器方法,专门处理字段别名并返回最终的credentials集合:

    public function getCredentialsAttribute()
    {
        // 复制properties数组
        $credentials = $this->properties;
        
        // 将profilepicture替换为picture
        if (isset($credentials['profilepicture'])) {
            $credentials['picture'] = $credentials['profilepicture'];
            unset($credentials['profilepicture']);
        }
        
        return $credentials;
    }
    
  3. 简化控制器代码
    现在你可以直接在控制器里调用模型的credentials属性,不用再做额外处理:

    $authResponsePayload = [
        'access_token' => $token,
        'credentials' => $credential->credentials,
    ];
    

方法二:自定义属性转换类(适合读写双向场景)

如果你的业务需要在写入数据时也处理字段别名(比如前端传picture字段,要自动转成profilepicture存到数据库),自定义Cast类是更合适的选择:

  1. 创建自定义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);
        }
    }
    
  2. 在模型中使用自定义Cast
    修改Credential模型的$casts属性,把properties字段关联到咱们的自定义Cast类:

    class Credential extends Model
    {
        protected $casts = [
            'properties' => \App\Casts\CredentialsCast::class,
        ];
    }
    
  3. 控制器直接使用
    现在不管是读取还是写入,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:47:56