Laravel 5.3碳日期格式未设置返回?

时间:2016-11-04 12:04:00

标签: php laravel-5.3 php-carbon

我有我的VitalSignSet模型:

class VitalSignSet extends Model
{
  protected $dates = [
        'datetimetaken',
  ];

  . . .
}

现在在我的函数中我有这个函数,它返回json编码的遇到最新的生命体征集。 (Encounter与VitalSignSet有一个hasMany关系)在返回之前,我希望datetimetaken字段的格式是为了人类的可读性,但仅适用于这种特殊的方法。 (这就是我没有使用访问者的原因)

public function get(Request $request, Encounter $encounter) {
   // Setting the latest vital sign set
   $encounter->latest_vitals = $encounter->VitalSignSets()
             ->orderBy('datetimetaken','desc')->get()->first();

   // Formatting the date :
   // Works when just returning the date.
   // Does not return in this format when returning the model with the date.
   $encounter->lastest_vitals->datetimetaken->format('M j, Y');

   return $encounter->toJson();
}

从js ajax请求访问上述方法。当我解析并记录响应时,datetimetaken格式没有改变。 (仍然是YYYY-mm-dd H:i:s格式)但是当我在格式化后返回$encounter->latest_vitals->datetimetaken;时,将返回一个字符串,格式为I set。但是当我返回包含VitalSignSet模型$encounter->latest_vitals;(json响应)时,格式在YYYY-mm-dd中。那是为什么?

1 个答案:

答案 0 :(得分:1)

这是因为您只是访问数据对象,而您实际上并未对其进行更改。

不幸的是,我无法(我能够找到)编辑模型中Carbon实例的格式。这是因为Laravel使用相同的格式来解析数据库中的日期时间,就像将其格式化为字符串一样。

此外,您无法将格式化的字符串分配给原始字符串,因为Eloquent将尝试解析该字符串(并失败)。

一种方法(如果你想/需要保持密钥为datetime)将输出转换为数组,编辑值,然后返回:

$latestVitals = $encounter->VitalSignSets()
    ->orderBy('datetimetaken', 'desc')->first();

$encounter->latest_vitals = collect($latestVitals->toArray())
    ->pipe(function ($item) use ($latestVitals) {
        $item['datetimetaken'] = $latestVitals->datetimetaken->format('M j, Y');

        return $item;
    });

return $encounter;

如果您不介意将密钥更改为其他内容(例如formatted_datetimetaken),您可以为VitalSignSet添加任何模型的访问器:

public function getFormattedDatetimetakenAttribute()
{
    return $this->datetimetaken->format('M j, Y');
}

然后只使用append()

$encounter->latest_vitals = $encounter->VitalSignSets()
    ->orderBy('datetimetaken','desc')
    ->first()->append('formatted_datetimetaken');

最后,您可以使用http://momentjs.com/docs之类的内容编辑js中的日期时间。假设您的响应已分配给变量response

response.latest_vitals.datetimetaken = moment(response.latest_vitals.datetimetaken, "YYYY-MM-DD HH:mm:ss")
            .format("MMM D, YYYY")

希望这有帮助!