生の式であるため、DB::raw()
を使用する必要があります CURRENT_TIMESTAMP
を設定します 列のデフォルト値として:
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
これは、すべてのデータベースドライバーで問題なく機能します。
Laravel 5.1.25以降( PR10962
を参照 および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
有効な日付とは見なされなくなりました。 Laravel5.2アップグレードガイド に記載されています 、データベースにレコードを挿入するとき、すべてのタイムスタンプ列は有効なデフォルト値を受け取る必要があります。useCurrent()
を使用できます 移行時に列修飾子(Laravel 5.1.25以降)を使用して、タイムスタンプ列を現在のタイムスタンプにデフォルト設定するか、タイムスタンプをnullable()
にすることができます。 null値を許可します。 -
PostgreSQL&Laravel 4.x
Laravel 4.xバージョンでは、PostgreSQLドライバーはデフォルトのデータベース精度を使用してタイムスタンプ値を保存していました。CURRENT_TIMESTAMP
を使用する場合 デフォルトの精度で列の関数を実行すると、PostgreSQLは利用可能なより高い精度のタイムスタンプを生成するため、2番目の部分が分数のタイムスタンプを生成します-このSQLフィドルを参照 。これにより、Carbonはマイクロ秒が格納されることを期待しないため、タイムスタンプの解析に失敗します。この予期しない動作によってアプリケーションが破損するのを防ぐには、
CURRENT_TIMESTAMP
に明示的にゼロの精度を与える必要があります。 以下のように機能します:$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
Laravel 5.0以降、
timestamp()
列は、これを回避するデフォルトの精度ゼロを使用するように変更されました。
@andrewhl に感謝します コメントでLaravel4.xの問題を指摘してくれました。
@ChanakaKarunarathne
に感謝します 新しいuseCurrentOnUpdate()
を引き出すため コメントのショートカット。