Като се има предвид, че е необработен израз, трябва да използвате DB::raw()
за да зададете CURRENT_TIMESTAMP
като стойност по подразбиране за колона:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
Това работи безупречно на всеки драйвер за база данни.
От Laravel 5.1.25 (вижте PR 10962
и commit 15c487fe
) вече можете да използвате новия useCurrent()
метод модификатор на колона за постигане на същата стойност по подразбиране за колона:
$table->timestamp('created_at')->useCurrent();
Обратно към въпроса, на MySQL можете също да използвате ON UPDATE
клауза чрез DB::raw()
:
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
Отново, от Laravel 8.36.0 (вижте PR 36817
) вече можете да използвате новия useCurrentOnUpdate()
метод модификатор на колона заедно с useCurrent()
модификатор за постигане на същата стойност по подразбиране за колона:
$table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
Разбирам
-
MySQL
Започвайки с MySQL 5.7,0000-00-00 00:00:00
вече не се счита за валидна дата. Както е документирано в ръководство за надграждане на Laravel 5.2 , всички колони с времеви отпечатъци трябва да получат валидна стойност по подразбиране, когато вмъквате записи във вашата база данни. Можете да използватеuseCurrent()
модификатор на колони (от Laravel 5.1.25 и по-нови) във вашите миграции, за да зададете по подразбиране колоните с времеви отпечатъци към текущите времеви печати или можете да направите времеви печатиnullable()
за да разрешите нулеви стойности. -
PostgreSQL &Laravel 4.x
Във версиите на Laravel 4.x драйверът на PostgreSQL използваше прецизността на базата данни по подразбиране за съхраняване на стойности на времеви клеймъци. Когато използватеCURRENT_TIMESTAMP
функция върху колона с точност по подразбиране, PostgreSQL генерира времеви печат с налична по-висока точност, като по този начин генерира времеви печат с частична втора част - вижте тази SQL цигулка .Това ще накара Carbon да не успее да анализира времевата марка, тъй като няма да очаква съхраняване на микросекунди. За да избегнете това неочаквано поведение, нарушаващо приложението ви, трябва изрично да дадете нулева точност на
CURRENT_TIMESTAMP
функция, както следва:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
От Laravel 5.0,
timestamp()
колони е променена, за да използва нула по подразбиране точност, което избягва това.
Благодаря на @andrewhl за посочването на проблема с Laravel 4.x в коментарите.
Благодаря на @ChanakaKarunarathne
за извеждане на новия useCurrentOnUpdate()
пряк път в коментарите.