2015-12-29 5 views
8

У меня есть миграция, которая имеет метод timestamps(), а затем у меня есть семя для семени этой таблицы.Laravel timestamps() не создает CURRENT_TIMESTAMP

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

Семя выглядит следующим образом:

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

Когда все он будет запущен с помощью:

php artisan migrate:refresh --seed 

Элемент Вставляется, но значения created_at и updated_at являются оба 0000-00-00 00:00:00 почему Правильно ли они установлены?

здесь схемы столбцов, которые он создает:

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

Я хотел бы эти схемы:

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

Используйте модели Eloquent для создания записей вместо интерфейса Fluent, и они должны быть установлены правильно. –

ответ

23

При вставке данных не используется красноречивый вам нужно вставить метки времени по своему усмотрению.

Если вы используете:

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

вы будете иметь метки времени заполнены правильно (конечно, вы должны создать MyTable модель первого)

EDIT

Если вы действительно хотите вы можете изменение:

$table->timestamps(); 

в:

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

И если вы создаете модель для этой таблицы, вы должны установить

$timestamps = false; 

, чтобы убедиться, что Красноречивый не будет пытаться установить их на своем пути.

EDIT2

Существует и еще один важный вопрос. Если вы смешиваете даты установки в таблицах с PHP, а в других в MySQL, вы должны убедиться, что как в PHP, так и в MySQL есть то же самое время и время (и часовой пояс), или вы должны использовать то же сопоставление даты, что и в записи (либо MySQL или PHP). В противном случае при выполнении запросов вы можете получить неожиданные результаты, например

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

может отличаться, чем при запуске запроса с переходом даты PHP

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

, потому что на PHP сервере может быть, например, 2015-12-29, но на сервере MySQL 2015-12-30

+0

Я не думаю, что это проблема ... Я обновил вопрос ... –

+0

@GetOffMyLawn Пожалуйста, посмотрите на мое редактирование –

+0

Итак, у меня есть это (только что прокомментировано). Так вот как это должно быть сделано, я думал, что ларавел сделал бы это. Хорошо спасибо –

0

Я бы использовал библиотеку углерода, если я посеяю на отметках времени и настроил это на фабрике. если вы не могли бы сделать что-то вроде этого:

$timestamps = false; 

и я бы удалить в $table->timestamps(); от миграции, если я не буду использовать его.

0

Для более поздних версий вы можете просто использовать. (source)

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