Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [LR] Castowanie dat
markonix
post
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Carbon to nic innego jak nakładka na DateTime

Twoim rozwiązaniem będzie zrzutowanie tego na string.
Go to the top of the page
+Quote Post
markonix
post
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


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ą :/

Ten post edytował markonix 12.06.2016, 20:34:52
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


No to mówię. Musisz przed wrzuceniem tego w json zrobić coś na zasadzie:

Kod
$obj->expire = $obj->expide->toDateString()
Go to the top of the page
+Quote Post
markonix
post
Post #5





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

Ostrzeżenie: (0%)
-----


  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.

Ten post edytował markonix 13.06.2016, 22:15:34
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 03:51