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(); от миграции, если я не собираюсь использовать его.