カテゴリー: BackEnd

EloquentのtoArray()とtoJson()をカスタマイズ

はじめに

LaravelのEloquentには色々便利な機能がありますが、今回はモデルのシリアライズに関する機能を紹介したいと思います。

$visibleプロパティと$hiddenプロパティ

Laravel開発ではモデルをtoArray()メソッドやtoJson()メソッドで配列やJSONに変換して利用する事がよくあると思います。
その際に含める属性と含めない属性を定める事が出来ます。

例えばよくあるユーザー情報テーブルのUserモデルを例にします。

このモデルには、id, firstname, lastname, email, passwordの値を保持しています。

$visibleプロパティ

$visibleプロパティに加えた属性は変換結果に含まれます。所謂、ホワイトリスト的な使い方が出来ます。

APIのレスポンスにモデルを使用したい場合などに、パスワードなど極力外に出したく無いものを除いて、変換結果を取得する事が出来ますね。

class User extends Model
{
  // 配列内に含めたい属性を定義
  protected $visible = ['id', 'firstname', 'lastname', 'email'];
}
$user = User::all()->toArray();
// [["id" => ...], ["firstname" => ...], ["lastname" => ...], ["email" => ...]]

$hiddenプロパティ

$hiddenプロパティに加えた属性は変換結果に含まれません。

$visibleプロパティとは逆にブラックリスト形式に指定する事が出来ます。

class User extends Model
{
  // 配列内に含めたい属性を定義
  protected $hidden = ['password'];
}
$user = User::all()->toArray();
// [["id" => ...], ["firstname" => ...], ["lastname" => ...], ["email" => ...]]

独自属性の追加

$appendsプロパティ

データベースのカラムに存在しない属性をモデル変換後の配列やJSONに含めたい場合があると思います。その場合は、$appendsプロパティに定義しておく事で通常のカラム属性の様に扱える事が出来ます。例として、関数の返却値を独自属性として追加しています。

class User extends Model
{
  // 配列内に含めたい独自属性を定義
  protected $appends = ['full_name'];

  // 名字と名前を合わせて、フルネームを返す
  public function fullName() {
      return $this->firstname . $this->lastname;
  }
}

ここで、先程の$visibleプロパティや$hiddenプロパティに追加すると、その他属性と同様に扱えます。

class User extends Model
{
  // 配列内に含めたい属性を定義
  protected $visible = ['id', 'firstname', 'lastname', 'full_name'];

  // 配列内に含めたい独自属性を定義
  protected $appends = ['full_name'];

  // 関数の返却値を独自属性としてみる
  public function fullName() {
      return $this->firstname . $this->lastname;
  }
}
$sample = Sample::all()->toArray();
// [["id" => ...], ["firstname" => ...], ["lastname" => ...], ["full_name" => ...]]

使い所

モデルの中身をAPIレスポンスとして返す際に、不要な値をレスポンスに含めない様にしたり、データベースカラムにない独自属性をレスポンスに含めたりする様な場面で使用出来るかと思います。

また、フロントサイドにJSフレームワーク(Vue.jsなど)を使用している場合に、Laravel側からVue側にモデルデータをJSONとして渡す事があるかと思いますが、こういう場合にも独自属性を利用してVue側で必要な値を予め渡しておく事も可能になるかと思います。

さいごに

Laravelは細かな便利機能も多いので、今後も紹介していけたらと思います。

おすすめ書籍

Yossy

コメントを見る

シェア
執筆者:
Yossy
タグ: phplaravel

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前