DateTime při nulové hodnotě

Allconius
Člen | 228
+
0
-

Ahoj,

mám v databázi sloupec ve formátu DATE, když je tam datum vyplněné tak si ho zobrazím jednoduše:

$arrival = $row->arrival->format('m/d/Y');

ale jak to mám ošetřit na nulovou hodnotu 0000–00–00 ? Chtěl bych aby se nevypisovalo nic a ne 11/30/-0001 :-)

David Matějka
Moderator | 6435
+
+3
-

Do databáze neukladej 0000–00–00, ale null

h4kuna
Backer | 729
+
+3
-

Mylné tvrzení

Druhak to má výhodu, až nad sloupeček nastavíš index, aby se ti rychleji řadilo, tak null hodnoty se do indexu neukládají.

Editoval h4kuna (12. 1. 14:01)

Allconius
Člen | 228
+
0
-

David Matějka napsal(a):

Do databáze neukladej 0000–00–00, ale null

Ahoj, díky a jak si pak mám jednoduše ošetřit to tahání z DB ?
Když tam nechám to:

$arrival = $row->arrival->format('m/d/Y');

tak mi to vyhodí „Call to a member function format() on null“
Ošetřil jsem to takto:

$arr = (array)$row->arrival;
   if (!$arr) {
       $arrival = '';
   }else{
       $arrival = $row->arrival->format('m/d/Y');
   }

Je to takto OK ?
A ještě dotaz, proč mi nefunguje:

echo $row->arrival->date;

píše to „Cannot read an undeclared property Nette\Utils\DateTime::$date.“. Myslel jsem že $row->arrival je třída (objekt) DateTime:

Nette\Utils\DateTime Object ( [date] => 2022-07-18 00:00:00.000000 [timezone_type] => 3 [timezone] => Europe/Prague )

Editoval Allconius (12. 1. 6:59)

David Grudl
Nette Core | 7734
+
0
-

$row->arrival?->format('m/d/Y') od PHP 8.0

David Matějka
Moderator | 6435
+
+1
-

@h4kuna kde si na to přišel? U jaké databáze?

David Grudl
Nette Core | 7734
+
0
-

Dibi ty 0000–00–00 převádí na null, Nette Database je předává do DateTime a PHP z toho udělá 30.11.-1. Asi by bylo lepší do NDB portovat chování z Dibi… Ale samozřejmě ideální je tyhle hodnoty v DB nemít.

hrach
Člen | 1822
+
+1
-

Note: Pokud MySQL je zapnuta se strict modem, tak 0000-… datum ani nepovoli. A je plno dalsich duvodu to tak zapnout.

h4kuna
Backer | 729
+
0
-

@DavidMatějka Máš pravdu, díky za opravu.

  • NULL se neukládá jen u primárního indexu, kde není ani povolený mysql
  • hraje roli u unique indexů, kdy se ingoruje, ale ukládá se