LaravelのBootメソッドで日付のデフォルト値を登録する方法
307 回閲覧されました
みなさんこんにちは、jonioです。
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以外にもあって主要で使う物として下記があります。
retrieved
: レコードの情報をデータベースから取得したときcreating
: 情報を新しいレコードとして作成する前created
: 情報を新しいレコードとして作成した後updating
: 既存のレコードの情報が更新される前updated
: 既存のレコードの情報が更新された後saving
: 情報がレコードに保存される前(新規作成および更新時)saved
: 情報がレコードに保存された後(新規作成および更新時)deleting
: レコードの情報が削除される前deleted
: レのコード情報が削除された後
今回は新しい情報をレコードとして作成する前なのでcreatingになります。
13行目の無名関数(クロージャ)の引数に$instanceを使っていますが引数を書くことによりカラムを呼び出すことができます。
そして15行目で本日の日付をdateカラムに登録しています。(この行の「Carbon」を使う為に1行目の記述があります)
これで完成です。