Метки времени 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,

10

Решение

Когда вы вставляете данные, не использующие 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

24

Другие решения

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

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

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

$timestamps = false;

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

0
По вопросам рекламы [email protected]