アクセサとは
データをDBから取得時に、フォーマットを予め設定することができます。
例えとして、Userモデルでユーザーの名前(アルファベット)の取得時に、常に頭文字を大文字にするケースを見てみましょう。
ucfirst
関数で、最初の文字がアルファベットであれば、大文字にしています。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* ユーザーの名前の取得
*
* @param string $value
* @return string
*/
public function getFirstNameAttribute($value)
{
return ucfirst($value);
}
}
これで値を設定できるようになりました。
設定として、関数名はget{カラム名}Attribute
とします。
カラム名は、アッパーキャメルケース(最初のアルファベットを大文字にする)とするお作法となっています。
今回の例だと、first_nameカラムに対してはgetFirstNameAttributeとなりますね。
あとは、コントローラーでfirst_name属性にアクセスすると見れるようになります。
use App\Models\User;
$user = User::find(1);
$firstName = $user->first_name;
また、モデルで新しい関数を作ることもできます。
/**
* ユーザーのフルネームの取得
*
* @return string
*/
public function getFullNameAttribute()
{
return "{$this->first_name} {$this->last_name}";
}
コントローラーでこのように記述すると、first_nameとlast_nameが一緒になったフルネームを取り出しできるようになります。
use App\Models\User;
$user = User::find(1);
$full_name = $user->full_name;
ミューテタとは
ミューテタは、アクセサの逆です。
データをDBに保存する前に、フォーマットを予め設定することができます。
設定として、関数名はset{カラム名}Attribute
となっています。
同様に、アッパーキャメルケースです。
ミューテタの場合はgetでなくsetですね。
DBに値を入れる時なのでイメージがつきやすいのではと思います。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* ユーザーの名前を設定
*
* @param string $value
* @return void
*/
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}
}
strtolower
関数で、文字列を小文字にしています。
例えばUserControllerがあるとして、以下のような書き方であっても、小文字として入力されるようになります。
user = new User();
$member->first_name = 'Bob';
$member->save();
なお、色々文献調べてましたが、Laravelで登録処理を作ってるなかで、created_atやupdated_atは自動で入る(ように感じる)ところも、ミューテタやアクセサが使われてるそうです。
Laravel特有の便利機能、実は普段から使っているっていうことは多々ありますね…。
まとめ
・アクセサは、データをDBから取得時に、フォーマットを予め設定することができる
・関数名の書き方は、get{アッパーキャメルケースでのカラム名}Attribute
・ミューテタは、データをDBに保存する前に、フォーマットを予め設定できる
・関数名の書き方は、set{アッパーキャメルケースでのカラム名}Attribute
主にリーダブルを参考にしながら記載しました。
コメント