Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [LR] Castowanie dat
Forum PHP.pl > Forum > PHP
markonix
Mamy daty w formacie Y-m-d w bazie.
Chciałbym skorzystać z fajnego narzędzia jakim jest rzutowanie dat na obiekt Carbon'a.

Wszystko fajnie, w widokach ładnie korzystam z format() ale to samo chciałbym zrobić w API ponieważ domyślnie zwraca datę z godziną (00:00:00).
Więc myślę sobie, że po prostu zrobię:

  1. $object->date = $object->date->format('Y-m-d');


No i niby prosta rzecz ale gdy ten obiekt przesyłam za pomocą response()->json to znowu datę rzutuje na obiekt carbon i dostaje z zerami :/

Częściowo problem naprawia:

  1. protected function serializeDate(\DateTime $date)
  2. {
  3. return $date->format('Y-m-d');
  4. }


Ale to znów zmienia format pozostałych kolumn. Liczyłem, że Carbon jakoś rozpoznaje DATETIME i DATE i potem przy wyrzucaniu na ekran wybiera odpowiedniejszy format.
Pyton_000
Carbon to nic innego jak nakładka na DateTime

Twoim rozwiązaniem będzie zrzutowanie tego na string.
markonix
Ale w innych miejscach korzystam z dobrodziejstw tej nakładki więc nie chce wyłączać całkiem tego castowania dla tego jednego przypadku.

Nie umiem zrozumieć dlaczego jak przekazuje zmodyfikowany obiekt do response (sprawdzałem, po użyciu format dump wskazuje, że ->date to string) z powrotem to rzutuje na Carbona.
Jak np. usunę castowany atrybut (unset) to serializer zupełnie się wysypuje co dla mnie też jest troszkę dziwne bo czasem człowiek chce zmodyfikować dane zanim wyśle response.

edit: Chyba używam źle nazewnictwa bo casting to inna metoda. Korzystam z tego (mutator):
  1. /**
  2. * The attributes that should be mutated to dates.
  3. *
  4. * @var array
  5. */
  6. protected $dates = ['created_at', 'updated_at', 'expire'];


Jakieś pomysły? :/

Tak samo jak zrobię metodę getExpireAttribute w której mogę zmienić format ale znów to działa wszędzie i rzutuje już na string przez to tam gdzie chce już nie użyje metod Carbon (musiałbym ręcznie castować).
Tak więc jeżeli nie da się ustawić oddzielnie formatu dla json i innego dla array (dla widoków) to interesuje mnie jak to tego:
  1. return response()->json(['data' => $obj]);

przekazać zmodyfikowany obiekt. Mogę dodać do niego parametr, mogę nadpisać wszystkie ale z tym "expire" cokolwiek próbuje robić wraca do formatu z godziną :/
Pyton_000
No to mówię. Musisz przed wrzuceniem tego w json zrobić coś na zasadzie:

Kod
$obj->expire = $obj->expide->toDateString()
markonix
  1. $obj->expire = $obj->expire->toDateString();
działa równoważnie do
  1. $obj->expire = $obj->expire->format('Y-m-d');
zresztą jak patrzę na kod to po prostu tylko alias.
To i to zwraca string, ale przy użyciu response()->json ten parametr znowu jest konwertowany do obiektu Carbon/DateTime, a potem na Y-m-d H:i:s.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.