[英]How do I change the date format Laravel outputs to JSON?
我在 Laravel 中構建了一個應用程序,並且 eloquent 以這種格式返回日期: 2015-04-17 00:00:00
。 我正在向 JSON 發送一個特定查詢,以便我可以使用 D3 制作圖表,我想我想要 ISO8601 中的日期( '1995-12-17T03:24:00'
)或其他與javascript Date() 構造函數。
有沒有辦法在 Laravel 端將日期格式更改為 JSON 輸出? 我不確定使用 mutator 是不是最好的方法,因為它會影響我應用程序其他部分的日期。
還是將 JSON 輸出保持原樣,並在將日期格式傳遞給 Date() 構造函數之前使用一些 javascript 字符串方法來操作日期格式會更好嗎? 哪種方法更有效?
這是我的模型:
class Issue extends Model {
protected $fillable = [
'client_id',
'do',
'issue_advocate',
'service_number',
'issue_location',
'issue_description',
'level_of_service',
'outcome',
'referral_id',
'file_stale_date',
'date_closed',
'issue_note',
'staff_hours'
];
protected $dates = [
'do',
'date_closed',
'file_stale_date'
];
public function setDoAttribute($value)
{
$this->attributes['do'] = Carbon::createFromFormat('F j, Y', $value)->toDateString();
}
}
這是我的查詢:
$issues = Issue::with('issuetypes')
->select(['do','level_of_service','outcome','id'])
->whereBetween('do',[$lastyear,$now])
->get()->toJson();
我回來的 JSON:
[{"do":"2014-12-23 00:00:00","level_of_service":1,"outcome":1,"id":18995,"issuetypes":[{"id":9,"issuetype":"Non Liberty","pivot":{"issue_id":18995,"issuetype_id":9}}]}]
我知道這是一個老問題,但仍然沒有很好的答案。 更改protected $dateFormat
將影響數據庫,而必須重寫方法serializeDate()
class MyModel extends Eloquent {
protected function serializeDate(\DateTimeInterface $date) {
return $date->getTimestamp();
}
}
或者我自己我選擇創造特質
trait UnixTimestampSerializable
{
protected function serializeDate(\DateTimeInterface $date)
{
return $date->getTimestamp();
}
}
然后添加
class SomeClassWithDates extends Model {
use UnixTimestampSerializable;
...
}
稍微擴展umbrel 的答案,我創建了一個特征,將 DateTimeInstance 轉換為Carbon實例,以便我可以輕松地使用它的common formats 。
在我的特殊情況下,我想根據 ISO-8601 序列化所有日期。
性狀如下...
use DateTimeInterface;
use Carbon\Carbon;
trait Iso8601Serialization
{
/**
* Prepare a date for array / JSON serialization.
*
* @param \DateTimeInterface $date
* @return string
*/
protected function serializeDate(DateTimeInterface $date)
{
return Carbon::instance($date)->toIso8601String();
}
}
從這里我可以簡單地在相關模型上使用它......
class ApiObject extends Model
{
use Iso8601Serialization;
}
顯然,如果您使用不同的格式,您可以更恰當地命名特征,但重點是您可以使用 Carbon 的任何常見格式,只需將toIso8601String()
替換為您需要的格式。
我強烈建議您使用 Carbon 類來處理所有日期和日期時間變量,它已經隨 Laravel 5 一起提供,因此您可以隨時開始使用。
在Carbon Repo上查看它,看看你能用它做什么。
例如,您可以像這樣格式化模型中的日期
Carbon::parse($model->created_at)->format('d-m-Y')
至於一個好的方法,我建議將存儲庫模式與 Presenters 和 Transformers 一起使用。 通過使用它,您可以定義您希望如何顯示/安裝您的 json,並選擇在您想要時跳過演示者,以便在您進行查詢時仍然讓您返回 Eloquent 模型。
通過將模型的$dateFormat屬性設置為您需要的格式,您可以輕松更改用於將模型序列化為 JSON 時將日期/時間轉換為字符串的格式,例如:
class MyModel extends Eloquent {
protected $dateFormat = 'Y-m-d';
}
您可以在此處的格式字符串中找到有關不同占位符的文檔:http: //php.net/manual/en/datetime.createfromformat.php
如果您使用通常的技術作為
protected $dateFormat = 'Y-m-d';
或者
protected function serializeDate(DateTimeInterface $date) { ... }
或者
protected $casts = [ "myDate" => "date:Y-m-d" ];
它僅在 laravel 將自己的對象序列化時才有效。 無論如何,您都會將這些代碼放在所有模型中,用於所有屬性。
所以我的解決方案,你必須(也)最后把這段代碼放在所有日期屬性的所有模型中,它適用於所有情況:
public function getMyDateAttribute()
{
return substr($this->attributes['my_date'], 0, 10);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.