トップページ
Laravel学習サイトLaravelやるばい

目次

LaravelのBootメソッドで日付のデフォルト値を登録する方法

みなさんこんにちは、あべ いさぢです。

Laravelではマイグレーションファイルに「$table->timestamps();」と記述すると「created_at」・「updated_at」カラムができて日付を自動的に登録できますが自作でdate型のカラムを作って登録しようとしたらデフォルト値がないとエラーが出ました。

こんな時にデフォルト値を登録する方法の解説です。


日付のデフォルト値をモデルで登録

定時処理(cron処理)をする際に処理をする日を登録しようとしてdate型のカラムを作って登録しようとしたらデフォルト値がないとエラーが出ました。

マイグレーションファイルに最初から記述されている「$table->timestamps();」じゃないと自動登録ができないみたいです。

日付のデフォルト値を登録するときに下記の方法ではうまくいかないみたいです。

protected $attributes = [
  'hidden' => "0"
];

こんな時はモデルに下記の記述をします。

use Carbon\Carbon;


        ・
        ・
        ・
        

protected static function boot()
{
  parent::boot();

  static::creating(function ($instance) {
    if (empty($instance->date)) {
      $instance->date = Carbon::now();
    }
  });
}

9行目のbootメソッドは11行目のbootメソッドを上書きする形で使います。

11行目のbootメソッドを定義しているクラスはModelクラスですが「Laravelのプロジェクト > vendor > laravel > framework > src > Illuminate > Database > Eloquent > Model.php」にあります。

13行目の「static::creating」はどのタイミングで処理を走らせるかを設定しています。

creating以外にもあって主要で使う物として下記があります。

今回は新しい情報をレコードとして作成する前なのでcreatingになります。

13行目の無名関数(クロージャ)の引数に$instanceを使っていますが引数を書くことによりカラムを呼び出すことができます。

そして15行目で本日の日付をdateカラムに登録しています。(この行の「Carbon」を使う為に1行目の記述があります)

これで完成です。

戻る