マイグレーションファイルでのtimestamp
Laravelでマイグレーションファイルを生成させると、timestamp
が自動的に設定されている。たとえばusers
テーブルを生成するマイグレーションファイルは以下のとおり。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class CreateUsersTable extends Migration { ..... public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); } ..... } |
生成されるテーブルの構造は以下のとおりで、引数を与えないtimestamps()
メソッドはcreated_at
とupdated_at
の2つのカラムを生成する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> DESCRIBE users; +-------------------+-----------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+-----------------+------+-----+---------+----------------+ | id | bigint unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | email_verified_at | timestamp | YES | | NULL | | | password | varchar(255) | NO | | NULL | | | remember_token | varchar(100) | YES | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +-------------------+-----------------+------+-----+---------+----------------+ 8 rows in set (0.00 sec) |
ところがMySQLのtimestamp
は2038年問題を回避できないので、安易にこのまま使うののではなく、これらをdatetime
型に変更しておいた方が安全。
timestamp | datetime |
UTC内部表現で保持 | タイムゾーン文字列で保持 |
1970-01-01 00:00:01UTC~2038-01-19 03:14:07UTC | 1000-01-01 00:00:00~9999-12-31 23:59:59 |
マイグレーションファイルの修正
timestamps()
を削除して、必要なら以下の2行に入れ替えるのが一方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->string('email')->unique(); //$table->timestamp('email_verified_at')->nullable(); $table->datetime('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); //$table->timestamps(); $table->datetime('created_at'); $table->datetime('updated_at'); }); } |
このように設定すると、Laravelの方で作成日時と更新日時を自動的に更新してくれる(tinkerでのモデル操作を参照)。