У меня есть миграция, которая имеет timestamps()
метод, а затем у меня есть семя, чтобы посеять эту таблицу.
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,
Когда вы вставляете данные, не использующие Eloquent, вам нужно вставить метки времени самостоятельно.
Если вы используете:
$x = new MyTable();
$x->title = 'My Awesome Title';
$x->save();
отметка времени будет заполнена правильно (конечно, вам нужно создать MyTable
модель первая)
РЕДАКТИРОВАТЬ
Если вы действительно этого хотите, вы можете изменить:
$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;
чтобы убедиться, что Eloquent не будет пытаться выставить их на своем пути.
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
Для более поздних версий вы можете просто использовать. (источник)
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
я бы использовал углеродную библиотеку, если посею метки времени и настрою на заводе.
если бы не вы могли сделать что-то вроде этого:
$timestamps = false;
и я бы удалил $table->timestamps();
от миграции, если я не собираюсь его использовать.