52
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】アクセサ、ミューテタの基本のキ

Posted at

#はじめに
今回はアクセサとミューテタの基本について解説します。
##そもそもミューテタとは?
そもそもミューテタってなんなんでしょうか?
簡単にいうとデータをデータベースに保存する時に走る一定の処理のことです。
##そもそもアクセサとは?
そもそもアクセサとはなんでしょうか?
簡単にいうとデータをデータベースから取得する時に走る一定の処理のことです。
##使用例
 例えば、都道府県をデータベースに保存する時を考えます。
 そのまま文字データとして都道府県を保存することもありますが、多くの場合は整数に置き換えて保存します。(1が北海道、2が青森など都道府県それぞれに対応させた整数を設定する。こうする理由は文字データより圧倒的に整数の方がデータ容量が少ないからデータベースを圧迫しないからです。)
 しかし、データベースにデータを保存する時に変換して、取得した時も変換してと毎回処理を書くのはめんどくさい。。。無駄なコードが増えるから邪魔!!!
できれば、アプリケーションで自動に処理してほしいですね。
 そこで、活躍するのがアクセサとミューテタです!!
今回は基本のキということで簡単な例を扱っていきます。
最低限必要なエッセンスだけ説明します。
では、スターーーーート!!

#アクセサとミューテタでなにができるの?
Laravelを使ったことがある人であれば、実はミューテタとアクセサはもう使っているんです!!
Laravelではcreated_at、updated_atは自動的にCarbonインスタンスに変換されて使うようになっています。
だから、日付に関しては簡単に実装することができます。(日付については最後に記載しています)
しかし、今回は自分で独自にミューテタ、アクセサの実装する方法について説明します。

#アクセサの実装方法
アクセサはモデル内に定義します。
##アクセサの命名規則はgetFooAttribute
アクセサを設定したいカラム名が「キャメルケース」でHogeの場合、カラムがあるモデルクラスにgetHogeAttributeメソッドを作成します。

##アクセサ定義例:first_nameカラムにアクセサ定義
Userモデルクラスに下記を追加
下記のコードでfirst_nameカラムを取得する時にgetHogeAttribute(頭文字を大文字に変える)が実行されます。

app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

getFirstNameAttribute の引数$valueがデータベースから取得したカラムの中身になります。
ちなみにucfirst($value)が頭文字を大文字にするメソッドです

##アクセサを実行する
上記のコードが正しく動いていれば、下記のように単純にfirst_nameカラムを引っ張ってくるだけで自動でgetFirstNameAttribute が実行されます。

$user = App\User::find(1);

$firstName = $user->first_name;

以上がアクセサの使い方です。

#ミューテタの実装方法
ミューテタもアクセサと同様にモデル内に定義します。

##ミューテタの命名規則
これもアクセサと同様に、アクセスしたいカラム名が「キャメルケース」でFooの場合、カラムがあるモデルクラス内にsetFooAttributeメソッドを作成します。

##ミューテタ定義例:first_nameカラムにミューテタ定義
下記のコードでfirst_nameカラムの保存時に自動でsetFirstNameAttribute が実行されます。

app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = strtolower($value);
    }
}

valueが設定しようとしている中身になります。
strtolower が全て小文字に変えるメソッドです。
setFirstNameAttribute の引数$valueが設定しようとしている値です。上記のメソッドはUserインスタンスのattributes プロパティのfirst_nameに小文字にした$valueが代入されるようになっています。

##ミューテタを実行してみる
下記の場合2行目のfirst_nameカラムにSallay を設定しようとした時に、setFirstNameAttributeメソッドが呼び出され、Sallayの値が渡され、ミューテタが実行されます。
実は保存時にミューテタが実行されるわけではなく、インスタンスに値を設定する時にミューテタは実行されることに注意です

$user = App\User::find(1);
$user->first_name = 'Sally';

#おまけ:日付ミューテタ
おまけに日付ミューテタについて記述します。
自分で作成した日付のカラムをCarbonインスタンスで扱い時、設定は簡単です。
定義する場所はミューテタと同じモデルの中に定義します。
その中にデフォルトである$datesをオーバーライドします

app/User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $dates = [
        'created_at',
        'updated_at',
        'deleted_at'
    ];
}

これにより、データベースからdelete_atを取得すると自動でCarbonインスタンスに変換されているため、
自由にCarbonにあるメソッドを使うことができます。
Carbonについてはこちらでざっとまとめているので、是非!!

以上です!!!
ここまで読んでいただきありがとうございました!!
疑問、気になるところがございましたら、質問、コメントよろしくお願いします!!!

52
60
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
60

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?