数据库字段本身就是驼峰命名字段,如何使用 Laravel 访问器

我的数据库字段是本身名字就是驼峰命名的字段,这个时候再使用访问器,是作用不到的。怎么办
这里是我的数据库一部分结构

  `finishTime` varchar(13) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单完成时间(时间戳,毫秒)',
  `orderEmt` tinyint(4) NOT NULL DEFAULT '0' COMMENT '下单设备(1:PC,2:无线)',
  `orderId` varchar(16) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单ID',
  `orderTime` varchar(13) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '下单时间(时间戳,毫秒)',

我写的模型的访问器,这样写的话,是没有用的

    /**
     * 获取下单时间
     */
    public function getOrderTimeAttribute($value)
    {
        return $value/1000;
    }

请各位大神指点一二

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 12

貌似没有好办法, 只能重写 Illuminate\Database\Eloquent\Concerns\HasAttributesIlluminate\Database\Eloquent\Model, 然后去继承自己写的 Model

覆盖默认的 trait HasAttributes,就能实现了

trait HasAttributes
{
// 片段
    public function hasGetMutator($key)
    {
        return method_exists($this, 'get'.Str::studly($key).'Attribute');
    }
    protected function mutateAttribute($key, $value)
    {
        return $this->{'get'.Str::studly($key).'Attribute'}($value);
    }

    public function hasSetMutator($key)
    {
        return method_exists($this, 'set'.Str::studly($key).'Attribute');
    }
    protected function setMutatedAttributeValue($key, $value)
    {
        return $this->{'set'.Str::studly($key).'Attribute'}($value);
    }
}
4年前 评论
L学习不停 4年前
houxin (楼主) 4年前
l333308 4年前

很奇怪的是为啥数据字段命名要用驼峰命名法~

4年前 评论
playmaker 4年前
kis龍 3年前

@犯二青年 这是数据库是旧的数据库,很早之前创建的,当时就是按照驼峰这种规范来创建的。

4年前 评论

@houxin 可以试试这么写

/**
 * 获取用户的姓名.
 *
 * @return string
 */
public function getFullNameAttribute()
{
    $FullName = $this->字段名;

    //TODO 对改字段做处理

    return $FullName
}
4年前 评论
犯二青年 (作者) 4年前
hedeqiang 4年前
犯二青年 (作者) 4年前
JaguarJack

似乎没办法。 最终都是他

Str::studly($key)
4年前 评论

数据库的字段好像是不分大小写的

4年前 评论
L学习不停 4年前

@expectedSelf

file
只是数据库内部是不区分的,意思就是说,你不能同时创建大小写的两个字段名称。但是laravel读入数据的时候,还是有大小写区分的。主要是laravel访问器,驼峰对应的数据字段是下划线连接的。而我们想让驼峰对应的字段,也是驼峰的。

4年前 评论

@犯二青年 换个名字就可以的, 比如像这样

    /**
     * 获取下单时间
     */
    public function getMyOrderTimeAttribute()
    {
        return $this->orderTime/1000;
    }

然后取值的时候, 这么取就可以

$model->my_order_time

下面的这种方式就不行,会报错,提示orderTime属性不存在。

    /**
     * 获取下单时间
     */
    public function getOrderTimeAttribute()
    {
        return $this->orderTime/1000;
    }

下列取值

$model->order_time

这样就会报错

4年前 评论

貌似没有好办法, 只能重写 Illuminate\Database\Eloquent\Concerns\HasAttributesIlluminate\Database\Eloquent\Model, 然后去继承自己写的 Model

覆盖默认的 trait HasAttributes,就能实现了

trait HasAttributes
{
// 片段
    public function hasGetMutator($key)
    {
        return method_exists($this, 'get'.Str::studly($key).'Attribute');
    }
    protected function mutateAttribute($key, $value)
    {
        return $this->{'get'.Str::studly($key).'Attribute'}($value);
    }

    public function hasSetMutator($key)
    {
        return method_exists($this, 'set'.Str::studly($key).'Attribute');
    }
    protected function setMutatedAttributeValue($key, $value)
    {
        return $this->{'set'.Str::studly($key).'Attribute'}($value);
    }
}
4年前 评论
L学习不停 4年前
houxin (楼主) 4年前
l333308 4年前

@may_J 用as是可以的。但是,每次查询,都要指定as才行的,而且那么多字段,要用select的话as的话,要指定的太多了

4年前 评论

直接模型上面追加 :亲测简单有效

protected $appends = ['orderTime'];      
public function getOrderTimeAttribute()
    {
        return $this->attributes['orderTime'];
    }
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!