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しか無いわけではないし、全ては対応できないだろうから、まあ仕方ないか。
毎度コレ↑をコピペするよりヘルパーとかサービスコンテナーの拡張で一箇所書いておけば使い回し聞くようにはなるとは思う。
以上!