#はじめに
今回はアクセサとミューテタの基本について解説します。
##そもそもミューテタとは?
そもそもミューテタってなんなんでしょうか?
簡単にいうとデータをデータベースに保存する時に走る一定の処理のことです。
##そもそもアクセサとは?
そもそもアクセサとはなんでしょうか?
簡単にいうとデータをデータベースから取得する時に走る一定の処理のことです。
##使用例
例えば、都道府県をデータベースに保存する時を考えます。
そのまま文字データとして都道府県を保存することもありますが、多くの場合は整数に置き換えて保存します。(1が北海道、2が青森など都道府県それぞれに対応させた整数を設定する。こうする理由は文字データより圧倒的に整数の方がデータ容量が少ないからデータベースを圧迫しないからです。)
しかし、データベースにデータを保存する時に変換して、取得した時も変換してと毎回処理を書くのはめんどくさい。。。無駄なコードが増えるから邪魔!!!
できれば、アプリケーションで自動に処理してほしいですね。
そこで、活躍するのがアクセサとミューテタです!!
今回は基本のキということで簡単な例を扱っていきます。
最低限必要なエッセンスだけ説明します。
では、スターーーーート!!
#アクセサとミューテタでなにができるの?
Laravelを使ったことがある人であれば、実はミューテタとアクセサはもう使っているんです!!
Laravelではcreated_at、updated_atは自動的にCarbonインスタンスに変換されて使うようになっています。
だから、日付に関しては簡単に実装することができます。(日付については最後に記載しています)
しかし、今回は自分で独自にミューテタ、アクセサの実装する方法について説明します。
#アクセサの実装方法
アクセサはモデル内に定義します。
##アクセサの命名規則はgetFooAttribute
アクセサを設定したいカラム名が「キャメルケース」でHogeの場合、カラムがあるモデルクラスにgetHogeAttributeメソッドを作成します。
##アクセサ定義例:first_nameカラムにアクセサ定義
Userモデルクラスに下記を追加
下記のコードでfirst_nameカラムを取得する時にgetHogeAttribute
(頭文字を大文字に変える)が実行されます。
<?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
が実行されます。
<?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
をオーバーライドします
<?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についてはこちらでざっとまとめているので、是非!!
以上です!!!
ここまで読んでいただきありがとうございました!!
疑問、気になるところがございましたら、質問、コメントよろしくお願いします!!!