初めてのLaravel 5.1 : (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);
    }

}

http://laravel.com/docs/5.1/eloquent-mutators#accessors-and-mutators

日付ミューテーター

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

class Article extends Model
{
    ...

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

    ...
}

http://laravel.com/docs/5.1/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"    // ただの文字列じゃん
>

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

>>> $article = App\Article::first();
>>> $article->published_at
=>  {    // 便利なCarbonじゃん
       date: "2015-02-24 10:22:54.000000",
       timezone_type: 3,
       timezone: "UTC"
   }
>>> $article->published_at = "2015-02-24 11:00:00"
=> "2015-02-24 11:00:00"
>>> $article->published_at
=>  {    // 便利なCarbonじゃん
       date: "2015-02-24 11:00:00.000000",
       timezone_type: 3,
       timezone: "UTC"
   }
>

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

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中