2015-12-29 28 views
8

Mam migrację, która ma metodę timestamps(), a następnie mam seed do zaszczepienia tej tabeli.Znaczniki czasu Laravel() nie tworzą CURRENT_TIMESTAMP

Schema::create('mytable', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('title'); 
    $table->timestamps(); 
}); 

Nasiona wygląda następująco:

DB::table('mytable')->insert([ 
    [ 
     'title' => 'My Awesome Title' 
    ] 
]); 

Kiedy to wszystko dostaje uruchomić za pomocą:

php artisan migrate:refresh --seed 

Element zostanie wstawiony, ale wartości created_at i updated_at są zarówno 0000-00-00 00:00:00 dlaczego czy nie są ustawione poprawnie?

oto systemy kolumnowe, że tworzy:

`created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', 
`updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', 

chciałbym tych schematów:

`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
+1

Użyj Efektywnych modeli do tworzenia rekordów zamiast interfejsu Fluent i powinny one być poprawnie ustawione. –

Odpowiedz

23

Po wstawieniu danych nie używając wymowny trzeba wstawić znaczniki czasu na własną rękę.

Jeśli używasz:

$x = new MyTable(); 
$x->title = 'My Awesome Title'; 
$x->save(); 

będziesz musiał datownik wypełniony poprawnie (oczywiście trzeba utworzyć pierwszy MyTable modelu)

EDIT

Jeśli naprawdę chcesz go można zmiana:

$table->timestamps(); 

do:

$table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP')); 
$table->timestamp('updated_at')->default(\DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP')); 

A jeśli stworzyć model tej tabeli, należy ustawić

$timestamps = false; 

aby upewnić Eloquent nie będzie próbował ustawić je na swojej drodze.

EDIT2

Jest jeszcze jedna ważna kwestia. W przypadku mieszania dat ustawień w tabelach z PHP i innych w MySQL powinieneś upewnić się, że zarówno w PHP, jak i MySQL jest dokładnie ta sama data-godzina (i strefa czasowa) lub powinieneś użyć tego samego porównania dat, co ustawiłeś w rekordzie (albo MySQL lub PHP). W przeciwnym razie podczas uruchamiania zapytań można uzyskać nieoczekiwane rezultaty na przykład

SELECT * FROM mytable WHERE DATE(created_at) = CURDATE() 

może być inna niż bieganie frazę przechodząc datę PHP

"SELECT * FROM mytable WHERE DATE(created_at) = '".date('Y-m-d")."'" 

ponieważ na serwerze PHP może to być na przykład 2015-12-29 ale na serwerze MySQL 2015-12-30

+0

Nie sądzę, że to jest problem ... Zaktualizowałem pytanie ... –

+0

@GetOffMyLawn Proszę spojrzeć na moją edycję –

+0

Dobra, mam to (tylko skomentowałem). Tak więc należy to zrobić, myślałem, że laravel zrobiłby to. Okay dzięki –

0

Używam biblioteki węgla, jeśli wysiewam w sygnaturach czasowych i ustawię to w fabryce. jeśli nie można zrobić coś takiego:

$timestamps = false; 

i chciałbym usunąć ten $table->timestamps(); z migracją, jeśli nie będę z niego korzystać.

0

W przypadku późniejszych wersji można po prostu użyć. (source)

$table->timestamp('created_at')->useCurrent(); 
$table->timestamp('updated_at')->useCurrent();