Laravel:转换为 JSON 时更改模型中碳日期的格式
Laravel: Change format of Carbon dates in models when converted to JSON
目前,当我将模型转换为 JSON 时,所有 Carbon 日期字段都像这样转换:
"end_time": {
"date": "2017-02-03 23:59:00.000000",
"timezone_type": 3,
"timezone": "Europe/London"
}
我希望使用 Atom
表示法进行转换。
这可以像这样在碳中完成:
$order->end_time->toAtomString()
其中 $date
是 Carbon
日期。
如何让模型在将日期转换为原子格式时转换为 JSON?
我知道可以像这样附加数据:https://laravel.com/docs/5.3/eloquent-serialization#appending-values-to-json
但这不会更改现有值的格式?
只要您愿意使用不同于 "end_time" 的名称,您提供的 link 应该是适合您的解决方案。您可以附加 "end_time_formatted" 或类似内容。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Event extends Model
{
protected $appends = ['end_time_formatted'];
public function getEndTimeFormattedAttribute()
{
return $this->end_time->toAtomString();
}
}
然后,任何时候您将模型投射到 json,它都会包含 "end_time_formatted"。
您的另一个选择(如果您需要保留相同的名称)是通过将 toJson 方法复制到您的模型中来覆盖它。我可能会建议不要这样做,但这样可以避免每次在将其转换为 JSON.
之前都说 $this->created_at = $this->created_at->toAtomString()
/**
* Convert the model instance to JSON.
*
* @param int $options
* @return string
*
* @throws \Illuminate\Database\Eloquent\JsonEncodingException
*/
public function toJson($options = 0)
{
$atom = $this->created_at->toAtomString();
$json = json_encode($this->jsonSerialize(), $options);
if (JSON_ERROR_NONE !== json_last_error()) {
throw JsonEncodingException::forModel($this, json_last_error_msg());
}
$json = json_decode($json);
$json->created_at = $atom;
$json = json_encode($json);
return $json;
}
我无法通过更改方法顶部的值来使其工作,所以我被迫 json_decode,然后 re-encode,感觉不对对我很好。如果您确实使用这条路线,我建议您深入挖掘一下,尝试让它在不需要解码的情况下工作。
另一种方法是格式化您从模型
收到的日期
您可以使用辅助方法将您的日期对象转换为您希望使用 carbon 的格式。
Carbon 有助于格式化能力,我觉得这就是您要找的东西:
your_function_name($created_at_date, $format = "jS M Y")
{
$carbon = new \Carbon\Carbon($created_at_date);
$formatted_date = $carbon->format($format);
return $formatted_date;
}
希望对您有所帮助。
冒着复活僵尸的风险,我将提出一个替代方案来解决这个问题:
重写特征 HasAttributes
:
定义的 serializeDate
方法
/**
* Prepare a date for array / JSON serialization.
*
* @param \DateTimeInterface $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date)
{
return $date->toAtomString();
}
目前,当我将模型转换为 JSON 时,所有 Carbon 日期字段都像这样转换:
"end_time": {
"date": "2017-02-03 23:59:00.000000",
"timezone_type": 3,
"timezone": "Europe/London"
}
我希望使用 Atom
表示法进行转换。
这可以像这样在碳中完成:
$order->end_time->toAtomString()
其中 $date
是 Carbon
日期。
如何让模型在将日期转换为原子格式时转换为 JSON?
我知道可以像这样附加数据:https://laravel.com/docs/5.3/eloquent-serialization#appending-values-to-json
但这不会更改现有值的格式?
只要您愿意使用不同于 "end_time" 的名称,您提供的 link 应该是适合您的解决方案。您可以附加 "end_time_formatted" 或类似内容。
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Event extends Model
{
protected $appends = ['end_time_formatted'];
public function getEndTimeFormattedAttribute()
{
return $this->end_time->toAtomString();
}
}
然后,任何时候您将模型投射到 json,它都会包含 "end_time_formatted"。
您的另一个选择(如果您需要保留相同的名称)是通过将 toJson 方法复制到您的模型中来覆盖它。我可能会建议不要这样做,但这样可以避免每次在将其转换为 JSON.
之前都说$this->created_at = $this->created_at->toAtomString()
/**
* Convert the model instance to JSON.
*
* @param int $options
* @return string
*
* @throws \Illuminate\Database\Eloquent\JsonEncodingException
*/
public function toJson($options = 0)
{
$atom = $this->created_at->toAtomString();
$json = json_encode($this->jsonSerialize(), $options);
if (JSON_ERROR_NONE !== json_last_error()) {
throw JsonEncodingException::forModel($this, json_last_error_msg());
}
$json = json_decode($json);
$json->created_at = $atom;
$json = json_encode($json);
return $json;
}
我无法通过更改方法顶部的值来使其工作,所以我被迫 json_decode,然后 re-encode,感觉不对对我很好。如果您确实使用这条路线,我建议您深入挖掘一下,尝试让它在不需要解码的情况下工作。
另一种方法是格式化您从模型
收到的日期您可以使用辅助方法将您的日期对象转换为您希望使用 carbon 的格式。
Carbon 有助于格式化能力,我觉得这就是您要找的东西:
your_function_name($created_at_date, $format = "jS M Y")
{
$carbon = new \Carbon\Carbon($created_at_date);
$formatted_date = $carbon->format($format);
return $formatted_date;
}
希望对您有所帮助。
冒着复活僵尸的风险,我将提出一个替代方案来解决这个问题:
重写特征 HasAttributes
:
serializeDate
方法
/**
* Prepare a date for array / JSON serialization.
*
* @param \DateTimeInterface $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date)
{
return $date->toAtomString();
}