初めてのLaravel 5.6 : (12) Eloquent アクセッサとミューテータ

Eloquentはモデルの属性を設定したり取得したりする時に、内容を変更できる便利な方法を提供しています。この属性内容を変換するメソッドをアクセッサとミューテータ呼びます。

アクセッサ

メソッド名は、get属性名Attribute() とします。属性名はテーブルの項目名がスネークケースで命名されていても、キャメルケースで記述する必要があるので注意してください。

class Article extends Model
{
    ...

    public function getTitleAttribute($value)
    {
        // 大文字に変換
        return mb_strtoupper($value);
    }

}

ミューテータ

メソッド名は、set属性名Attribute() とします。

class Article extends Model
{
    ...

    public function setTitleAttribute($value)
    {
        // 小文字に変換
        $this->attributes['title'] = mb_strtolower($value);
    }

}

https://laravel.com/docs/5.6/eloquent-mutators


日付ミューテータ

Elocuent にはデフォルトで日付ミューテータが備わっていて、created_at, updated_at 属性は PHP の DateTime を拡張した Carbon のインスタンスに変換されます。日付ミューテータを使用する属性を Eloquent に知らせるには、dates 配列に属性名を追加します。

class Article extends Model
{
    ...

    // published_at で日付ミューテータを使う
    protected $dates = ['published_at'];

    ...
}

https://laravel.com/docs/5.6/eloquent-mutators#date-mutators

published_at を日付ミューテータに指定する前

>>> $article = App\Article::first();
>>> $article->published_at
=> "2015-02-24 10:22:54"   // ただの文字列じゃん
>>>
>>> $article->published_at = "2015-02-24 11:00:00"
=> "2015-02-24 11:00:00"
>>> $article->published_at
=> "2015-02-24 11:00:00"    // ただの文字列じゃん
>>> exit

published_at を日付ミューテータに指定した後

>>> $article = App\Article::first();
>>> $article->published_at
=> Illuminate\Support\Carbon @1535126513 {#2866
     date: 2018-08-25 01:01:53.0 Asia/Tokyo (+09:00),
   }    // 便利な Carbon が返ってくる
>>>
>>> $article->published_at = "2018-08-25 12:00:00"
=> "2018-08-25 12:00:00"
>>> $article->published_at
=> Illuminate\Support\Carbon @1535166000 {#2856
     date: 2018-08-25 12:00:00.0 Asia/Tokyo (+09:00),
   }    // 便利な Carbon が返ってくる
>>> 

Carbonに関しては以下のサイトを参照ください。「PHP Carbon」で検索すると日本語の情報も見つかります。

http://carbon.nesbot.com/
https://github.com/briannesbitt/Carbon

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中