Laravel timestamps() не создает текущую временную метку
у меня есть миграция, которая имеет 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,
3 ответов
когда вы вставляете данные, не используя 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;
чтобы убедиться, что Красноречивый не попытается направить их в нужное русло.
EDIT2
есть еще один важный вопрос. В случае, если вы смешиваете даты установки в таблицах из PHP и в других в MySQL, вы должны убедиться, что как в PHP, так и в MySQL есть точно такое же datetime (и часовой пояс) или вы должны использовать то же сравнение дат, что и в записи (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 server 2015-12-30
для более поздних версий, вы можете просто использовать. (источник)
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
Я бы использовал библиотеку углерода, если я засеваю временные метки и устанавливаю это на заводе. если не вы могли бы сделать что-то вроде этого :
$timestamps = false;
и я бы удалил $table->timestamps();
от миграции, если я не собираюсь использовать его.