1

В настоящее время, когда я конвертировать модели в формате JSON, все поля даты углерода являются отливают так:Laravel: Изменить формат даты Углеродные в моделях при преобразовании в JSON

"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

Но это не меняет формат существующего значения?

ответ

1

Указанная вами ссылка должна быть решением для вас, если вы хотите использовать другое имя, чем «end_time». Вы можете добавить «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, скопировав его в вашу модель. Я бы посоветовал это сделать, но это не помешало бы говорить $this->created_at = $this->created_at->toAtomString() каждый раз, прежде чем отдать его JSON.

/** 
    * 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, а затем перекодировать, который не чувствует себя замечательно для меня. Если вы используете этот маршрут, я предлагаю вам немного глубже попытаться заставить его работать без необходимости декодирования.

0

Альтернатива использовать это для форматирования даты, которые вы получите от модели

Вы можете использовать вспомогательный метод, который преобразует ваш объект даты в формат, который вы хотите, используя углерод.

Углерод облегчает форматирование способностей, и я чувствую, что это то, что вы ищете:

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; 
    } 

Надеется, что это помогает.

2

С риском возрождения зомби, я должен представить альтернативное решение этой проблемы:

переопределять метод serializeDate определяется признак HasAttributes:

/** 
* Prepare a date for array/JSON serialization. 
* 
* @param \DateTimeInterface $date 
* @return string 
*/ 
protected function serializeDate(DateTimeInterface $date) 
{ 
    return $date->toAtomString(); 
} 
Смежные вопросы