メモレベルです。
laravel モデルで日時に指定したカラムにNULLを代入するには
laravelで日時のカラムを使うには
laravelでデータベースのテーブルに日時を入れたい場合、モデルの $dates にカラムを指定します。
1 2 3 4 5 |
class MyCourse extends Model { protected $guarded = []; protected $dates = ['start_at', 'open_message_at']; |
で、createやupdate するときは、バリデーションで日付を指定しますね。
1 2 3 4 |
$attributes = request()->validate([ 'name' => ['required', 'max:255'], 'start_at' => ['required', 'date'], ]); |
保存するときは、日付に変換するために、DateTime を使います。
1 2 3 |
$attributes['start_at'] = new \DateTime($attributes['start_at']); MyCourse::create($attributes); |
日付をNULLにしたいときのコード
さて、こんな感じだと、日付にNULLを入れることができません。僕はNULL入れる必要なく気にしていませんでしたが、クリアしたいのに現在時刻が入ってしまうっていう質問を受けました。
こんな時は、フォームでstart_at を空欄を許可して、空欄の時は、DateTime で変換しなければ大丈夫です。
バリデーション部分は、nullを許可します。
1 2 3 4 |
$attributes = request()->validate([ 'name' => ['required', 'max:255'], 'start_at' => ['nullable', 'date'], ]); |
そして変換はstart_atがセットされている時だけにします。
1 2 3 4 |
if (isset($attributes['start_at'])) { $attributes['start_at'] = new \DateTime($attributes['start_at']); } MyCourse::create($attributes); |
こんな感じでうまくNULLが入ります。ただし、データベースのテーブルのほうも、NULLを許可している必要はありますよ。
あと、この記事書いているとき、テストコードを削除した後なので、タイプミスや動かないなどあったら教えてください。多分、大丈夫なはずです・・・・
→やっぱり記事の通りに書き直して動作確認しました。大丈夫です。
コメント