Временные метки Laravel() не создают CURRENT_TIMESTAMP

У меня есть миграция с методом 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,

person Get Off My Lawn    schedule 29.12.2015    source источник
comment
Используйте модели Eloquent для создания записей вместо интерфейса Fluent, и они должны быть правильно настроены.   -  person Jeff Lambert    schedule 29.12.2015


Ответы (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;

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

ИЗМЕНИТЬ2

Есть и еще один важный вопрос. Если вы смешиваете даты установки в таблицах из 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

person Marcin Nabiałek    schedule 29.12.2015
comment
Хорошо, у меня есть это (только что закомментировано). Так вот как это должно быть сделано, я думал, что laravel сделает это. Хорошо спасибо - person Get Off My Lawn; 29.12.2015
comment
@GetOffMyLawn Я добавил еще одну информацию в EDIT2 - person Marcin Nabiałek; 29.12.2015

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

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
person bmatovu    schedule 24.10.2017
comment
вам не нужно указывать $timestamps = false; с этим - person Raiika; 25.04.2018
comment
Нет, потому что у вас все еще есть временные метки, но с другими значениями по умолчанию. - person bmatovu; 25.04.2018

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

$timestamps = false;

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

person Sari Yono    schedule 29.12.2015