7

我正在构建一个 API,我想将我的所有时间戳(如 created_at、deleted_at、... 等)作为复杂对象返回,包括实际的日期时间,还有时区。我已经在我的控制器中使用了 {Carbon/Carbon}。我也在模型中定义了我的日期字段。当我访问控制器中的日期字段时,我实际上得到了 Carbon 对象。但是当我将结果集作为 JSON 返回时,我只看到日期时间字符串。不是时区。

当前 JSON

{
    "id": 4,
    "username": "purusScarlett93",
    "firstname": null,
    "lastname": null,
    "language_id": 1,
    "pic": null,
    "email": null,
    "authtoken": "f54e17b2ffc7203afe345d947f0bf8ceab954ac4f08cc19990fc41d53fe4eef8",
    "authdate": "2015-05-27 12:31:13",
    "activation_code": null,
    "active": 0,
    "devices": [],
    "sports": []
}

我的希望 :)

{
  "id": 4,
  "username": "purusScarlett93",
  "firstname": null,
  "language_id": 1,
  "pic": null,
  "email": null,
   "authtoken":"f54e17b2ffc7203afe41d53fe4eef8",
   "authdate": [
     {
       "datetime": "2015-05-27 12:31:13",
       "timezone": "UTC+2"
     }
   ],
   "activation_code": null,
   "active": 0
 }

知道我在这里缺少什么吗?

4

2 回答 2

1

这是因为所有Carbon对象都有一个__toString()函数,当您尝试将对象转换为字符串(即 JSON)时会触发该函数。尝试查看是否可以在模型上创建自己的访问器,为您提供自定义数组而不是字符串。

public function getAuthdateAttribute(Carbon $authdate) {
   return [
           'datetime' => $authdate->toDateTimeString(),
           'timezone' => 'UTC' . $authdate->offsetHours
          ];
}

正如用户 Alariva 指出的那样,此方法将覆盖您的默认访问方式authdate;所以如果你想访问你的原始Carbon对象,也许你必须为此创建一个特殊的方法。

或者你可以有点聪明,做这样的事情:

public function getAuthdateAttribute(Carbon $authdate) {
   return [
           'datetime' => $authdate,
           'timezone' => 'UTC' . $authdate->offsetHours
          ];
}

然后访问原始对象:$carbon = $this->authdate['datetime']

于 2015-07-12T11:33:04.433 回答
0

您可以尝试在模型中添加这样的函数:

public function getAuthDateAttribute() {
  return [
   "datetime" => "2015-05-27 12:31:13",
   "timezone" => "UTC+2"
 ];}
于 2015-07-12T09:36:09.233 回答