LoginSignup
69
51

More than 5 years have passed since last update.

LaravelのDB migrationで日付のデフォルトを指定

Posted at

LaravelのDB migrationで日付のデフォルトを指定

$table->timestamps()で自動でcreated_at, updated_atを作ってくれるのは便利だが、こちらデフォルト値が指定できない。

作成日、更新日に関してはわざわざプログラム側で指定せずとも自動で入力してほしいところです。

↑のLaravelリポジトリのIssueには、

migration.php
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));

コレで実現出来る、とある。
Laravel作者のTaylor氏的にも「default()にDB::raw()突っ込んで対応で十分でしょ」という見解らしい。まあそうかもしれんが。

ただこのやり方はMySQLにしか対応していない。
PostgreSQLでやるには自作関数とトリガーを定義しないと無理なようだ。
面倒くさいが、以下の様にすれば自動更新出来る。

migration.php
public function up()
{
    Schema::connection('public')->create('medias', function(Blueprint $table) {
        // ココは両方共 CURRENT_TIMESTAMP で
        $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
        $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP'));
    });
    // 関数の定義
    DB::connection('public')->statement("
        create or replace function set_update_time() returns trigger language plpgsql as
        $$
          begin
            new.updated_at = CURRENT_TIMESTAMP;
            return new;
          end;
        $$;
    ");
    // トリガーの定義
    DB::connection('public')->statement("
        create trigger update_trigger before update on medias for each row
          execute procedure set_update_time();
    ");
}

public function down()
{
    // DBと関数とトリガーの削除処理
    Schema::connection('public')->drop('medias');
    DB::connection('public')->statement("
        DROP TRIGGER update_trigger ON medias;
    ");
    DB::connection('public')->statement("
        DROP FUNCTION set_update_time();
    ");
}

うん、面倒くさい。Taylorさん〜なんとかしてけろー。
まあDBもMySQLとPostgreSQLしか無いわけではないし、全ては対応できないだろうから、まあ仕方ないか。

毎度コレ↑をコピペするよりヘルパーとかサービスコンテナーの拡張で一箇所書いておけば使い回し聞くようにはなるとは思う。

以上!

69
51
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
69
51