Laravel Eloquent 序列化:如何重命名属性?

Posted

技术标签:

【中文标题】Laravel Eloquent 序列化:如何重命名属性?【英文标题】:Laravel Eloquent Serialization: how to rename property? 【发布时间】:2015-01-09 19:12:50 【问题描述】:

例如,我有扩展 Eloquent 的用户模型。在数据库表中,列名是user_id

读取后如何将结果输出为'userId'?

【问题讨论】:

您是只对一个变量的解决方案感兴趣,还是想将所有内容从snake_case 重命名为camelCase? @lukasgeiter 我想将所有内容从snake_case 重命名为camelCase。但我也想知道如何为一个变量做这件事。谢谢。 【参考方案1】:

使用属性访问器添加单个“别名”

您可以使用attribute accessors 来创建“新属性”:

public function getUserIdAttribute()
    return $this->attributes['user_id'];

这允许您以这种方式访问​​值:$user->userId

现在让我们将值添加到数组/JSON 转换中:

protected $appends = array('userId');

最后隐藏丑陋的user_id

protected $hidden = array('user_id');

转换为数组/JSON时,转换所有属性名

你也可以使用toArray()将模型转换为数组或JSON字符串时更改所有属性名称。

public function toArray()
    $array = parent::toArray();
    $camelArray = array();
    foreach($array as $name => $value)
        $camelArray[camel_case($name)] = $value;
    
    return $camelArray;

【讨论】:

完美!谢谢!有一个小错误:return $camelArray; 而不是 return $camelArray(); 我想知道在 Symfony 2 中是否有类似 jmsyst.com/libs/serializer/master/reference/annotations 的东西。 没有像这样开箱即用的东西。也许有这个包,当然你可以自己构建它;) 这对我正在进行的项目帮助很大。我的服务器需要改变模型中定义的属性,以便我们受信任的客户端应用程序可以使用返回的 Json。 +1【参考方案2】:

我就是这样做的。

protected $remap_attrs = ['old_name' => 'new_name'];
public function toArray()
    $array = parent::toArray();
    foreach($this->remap_attrs as $key => $new_key) 
        if(array_key_exists($key, $array)) 
            $array[$new_key] = $array[$key];
            unset($array[$key]);
        
    
    return $array;

【讨论】:

以上是关于Laravel Eloquent 序列化:如何重命名属性?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 - pluck() 方法返回数组

如何在 Laravel/Eloquent 中获得完整的关系

Laravel 5:如何使用 'where' 或 'orderBy' 使用 eloquent?

如何使用 eloquent 在 laravel 中编写多个连接

Laravel - Eloquent 连接

如何从 Laravel 8 Eloquent 中的嵌套关​​系中获取数据?