Laravel Eloquentの日付Castでより表現力豊かなモデルを作る

こんにちは。今回はEloquentのCast機能を使って日付を自在に操るEloquentの表現力を飛躍的に高める方法をお伝えします。

Castとは

EloquentのCast機能はEloquentのメンバを指定の型やオブジェクトに変換する機能のことです。基本文字列のEloquentメンバに型の概念を与えることができるので、モデルとしてより表現力を高めることができます。Castを導入効果を説明しやすい日付型を例に今回は説明したいと思います。

Todoモデルの期日を日付にCastしてみる

まずはTodoをモデルを用意します。Todoの期日(due_date)をメンバとして持たせ、期日を日付型にキャストします。Castするには$castに必要な項目名を登録します。今回は日付にcastするのでdue_date => datetime: Y-m-dと記述します。こうすることでCarbonオブジェクトとしてdue_dateを扱えます。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Todo extends Model
{
    use HasFactory;

    // castする項目を登録する
    protected $casts = [
        'due_date' => 'datetime:Y-m-d',
    ];
}

Castした値を活用する

これでCastの処理は完了です。では次にdue_dateを使用してビジネスロジックを記述してみましょう。Todoのタスクが期限切れかどうかを判定するhasDeadlinePassedメソッドを作ります。

    // 締切を過ぎたかどうか判定
    public function hasDeadlinePassed() {
        return $this->due_date->isPast();
    }

due_dateがCarbonオブジェクトなので、isPastメソッドを呼び出すだけで判定ができました。これは楽ですね。Tinkerを使って動作確認してみましょう。

>>> use App\Models\Todo;
>>> $todo = new Todo();
=> App\Models\Todo {#3722}
>>> $todo->due_date = '2021-11-10';
=> "2021-11-10"
>>> $todo->hasDeadlinePassed(); 
=> true // 本日は11/11なのでTrueが返ります。

まとめ

いかがでしょうか。Castを使うことで、Eloquentでビジネスロジックを実装できることがわかりました。あまり使われているところを見たことがないCastですが、使って損が無い機能です。まずは日付だけでも使ってみてはいかがでしょうか。

Laravel

Posted by kobainmac