2015-12-03 7 views
4

Я создал приложение в Laravel и красноречивые даты возврата в этом формате: 2015-04-17 00:00:00. Я отправляю один конкретный запрос в JSON, поэтому я могу создать график с D3, и я думаю, что мне нужны даты в ISO8601 ('1995-12-17T03:24:00') или какой-либо другой формат, который отлично сочетается с конструктором Date() javascript.Как изменить формат даты Laravel в JSON?

Есть ли способ изменить формат даты, который выводится на JSON на конце Laravel? Я не уверен, что использование мутатора - лучший подход, потому что это повлияет на дату в других частях моего приложения.

Или было бы лучше оставить выход JSON как есть и использовать некоторые методы строки javascript для управления форматом даты перед передачей его в конструктор Date()? Какой подход более эффективен?

Вот моя модель:

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}}]}] 
+0

Вы можете разобрать дату в довольно любой формат в D3. –

+0

Попробуйте использовать мутаторы и аксессоры, подробнее об этом от laravel doc –

+1

С 'd3' это так же просто, как:' var format = d3.time.Формат ('% Y-% m-% дТ% H:% M:% S'); var myDate = format.parse ('1995-12-17T03: 24: 00'); ' – Mark

ответ

1

Вы можете легко изменить формат, используемый преобразовать дату/время в строку, когда ваши модели сериализуются как JSON, установив $ dateFormat свойства вашей модели в формат вам нужно, например:

class MyModel extends Eloquent { 
    protected $dateFormat = 'Y-m-d'; 
} 

Вы можете найти документацию на различных заполнителях, которые можно использовать в строке формата здесь: http://php.net/manual/en/datetime.createfromformat.php

+3

Кроме того, пусть ваша модель знает, какие поля являются датами, используя' protected $ dates = ['my_date_field', 'updated_at', 'disabled_at' ]; 'Это приведет к тому, что эти поля возвращают экземпляр Carbon по умолчанию и будут отформатировать их в соответствии с $ dateFormat, когда вы выгрузите их в JSON. – Jeff

+1

Я использую 'protected $ dates'. Я не думаю, что 'protected $ dateFormat = 'U';' будет работать для меня, потому что похоже, что это повлияет на то, что происходит с базой данных. Когда я экспериментирую с ним, это, похоже, не влияет на выход JSON. Может быть, я делаю это неправильно? Я отредактирую свое сообщение, чтобы включить код. – Erin

+0

Он должен работать, взгляните на метод класса Eloquent Model serializeDate(): https://github.com/illuminate/database/blob/5.1/Eloquent/Model.php#L2969 это то, что используется при сериализации модели объект json. просто убедитесь, что все поля даты включены в свойство $ date. –

2

Я настоятельно рекомендую использовать класс углерода в обрабатывать все ваши даты и переменные datetimes, он уже поставляется с Laravel 5, чтобы вы могли начать использовать, когда захотите.

Проверьте его на Carbon Repo, чтобы узнать, что вы можете с ним сделать.

В качестве примера, вы можете форматировать даты от вашей модели, как этого

Carbon::parse($model->created_at)->format('d-m-Y') 

Что касается хорошего подхода, я бы предложил использовать Repository Pattern вместе с выступающими и трансформаторами. Используя его, вы можете определить, как вы хотите, чтобы ваш json отображался/монтировался, и вы можете пропускать презентатора всякий раз, когда хотите, чтобы вы все еще получили модель Eloquent, возвращаемую при выполнении ваших запросов.

+0

Я использую углерод. Думаю, в Laravel нет возможности повлиять только на выход JSON? Я довольно новый разработчик, и мне кажется, что шаблон репозитория может быть слишком сложным для меня. – Erin

7

Я знаю, что это старый вопрос, но до сих пор нет хорошего ответа. Изменения protected $dateFormat будет влиять на базу данных, а метод serializeDate() должен быть переопределен

class MyModel extends Eloquent { 
    protected function serializeDate(DateTime $date) { 
     return $date->getTimestamp(); 
    } 
} 

Или сам я решил создать черт

trait UnixTimestampSerializable 
{ 
    protected function serializeDate(DateTimeInterface $date) 
    { 
     return $date->getTimestamp(); 
    } 
} 

, а затем добавить

class SomeClassWithDates extends Model {  
    use UnixTimestampSerializable; 

    ... 
} 
+1

Согласовано. Основная проблема заключается в том, что переопределение '$ dateFormat' будет влиять как на вход, так и на выход, тогда как вопрос касается только форматирования вывода. – frinux

Смежные вопросы