はじめに
LaravelのEloquentには色々便利な機能がありますが、今回はモデルのシリアライズに関する機能を紹介したいと思います。
Laravel開発ではモデルを
toArray()
メソッドや
toJson()
メソッドで配列やJSONに変換して利用する事がよくあると思います。
その際に含める属性と含めない属性を定める事が出来ます。
例えばよくあるユーザー情報テーブルのUserモデルを例にします。
このモデルには、
id, firstname, lastname, email, password
の値を保持しています。
$visibleプロパティ
$visible
プロパティに加えた属性は変換結果に含まれます。所謂、ホワイトリスト的な使い方が出来ます。
APIのレスポンスにモデルを使用したい場合などに、パスワードなど極力外に出したく無いものを除いて、変換結果を取得する事が出来ますね。
1 2 3 4 5 | class User extends Model { // 配列内に含めたい属性を定義 protected $visible = ['id', 'firstname', 'lastname', 'email']; } |
1 2 | $user = User::all()->toArray(); // [["id" => ...], ["firstname" => ...], ["lastname" => ...], ["email" => ...]] |
$hidden
プロパティに加えた属性は変換結果に含まれません。
$visible
プロパティとは逆にブラックリスト形式に指定する事が出来ます。
1 2 3 4 5 | class User extends Model { // 配列内に含めたい属性を定義 protected $hidden = ['password']; } |
1 2 | $user = User::all()->toArray(); // [["id" => ...], ["firstname" => ...], ["lastname" => ...], ["email" => ...]] |
独自属性の追加
$appendsプロパティ
データベースのカラムに存在しない属性をモデル変換後の配列やJSONに含めたい場合があると思います。その場合は、
$appends
プロパティに定義しておく事で通常のカラム属性の様に扱える事が出来ます。例として、関数の返却値を独自属性として追加しています。
1 2 3 4 5 6 7 8 9 10 | class User extends Model { // 配列内に含めたい独自属性を定義 protected $appends = ['full_name']; // 名字と名前を合わせて、フルネームを返す public function fullName() { return $this->firstname . $this->lastname; } } |
ここで、先程の
$visible
プロパティや
$hidden
プロパティに追加すると、その他属性と同様に扱えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | class User extends Model { // 配列内に含めたい属性を定義 protected $visible = ['id', 'firstname', 'lastname', 'full_name']; // 配列内に含めたい独自属性を定義 protected $appends = ['full_name']; // 関数の返却値を独自属性としてみる public function fullName() { return $this->firstname . $this->lastname; } } |
1 2 | $sample = Sample::all()->toArray(); // [["id" => ...], ["firstname" => ...], ["lastname" => ...], ["full_name" => ...]] |
使い所
モデルの中身をAPIレスポンスとして返す際に、不要な値をレスポンスに含めない様にしたり、データベースカラムにない独自属性をレスポンスに含めたりする様な場面で使用出来るかと思います。
また、フロントサイドにJSフレームワーク(Vue.jsなど)を使用している場合に、Laravel側からVue側にモデルデータをJSONとして渡す事があるかと思いますが、こういう場合にも独自属性を利用してVue側で必要な値を予め渡しておく事も可能になるかと思います。
さいごに
Laravelは細かな便利機能も多いので、今後も紹介していけたらと思います。
そんなことできたんですね~勉強になります(^^♪