【Laravel】 Eloquentモデルにテーブルに無い属性を追加する

こんにちは。今回はEloquentモデルの便利機能に関するお話です。

突然ですが、皆さんはEloquentで取得した項目に対して毎回同じような処理をしていることはありませんか?例えば以下のように

  • 電話番号を毎回ハイフン区切りにしている
  • 姓と名を繋げている
  • 日付の書式を変更している

いかがでしょうか。心当たりがあるんじゃないでしょうか。

今回はこういった処理を何回も書かなくても良い方法を解説します。

Eloquentモデルの属性を追加する

Eloquentの属性として定義することで、何回も同じ処理を書かなくても良くなります。例えばMembersテーブルの会員名がfirst_nameとlast_nameに分かれているとします。これらは画面や帳票に表示する際につなげて表示することが多い項目です。first_nameとlast_nameをつなげたname属性をMemberモデルに作成してみましょう。

まずnameを作らない状態でMemberモデルからfindメソッドでデータを取得してみます。

>>> App\Models\Member::find(1);
=> App\Models\Member {#4211
     id: "1",
     last_name: " tanaka",
     first_name: "ichiro"
   }

Memberモデルはid,last_name,first_nameの3属性を持つシンプルなモデルであることがわかります。ではname属性を追加します。

class Member extends Model
{
	  protected $appends = ['name'];

	  /**
     * 姓名をつなげる
     *
     * @return string
     */
    public function getNameAttribute()
    {
        return $this->attributes['last_name'] . ' ' . $this->attributes['first_name'];
    }
}

Memberモデルに属性を追加します。属性はget[属性名]Attributeという名前の関数で定義します。今回はnameという名前の属性を追加するのでgetNameAttribute関数を追加しました。追加した関数の中でlast_nameとfirst_nameを文字列結合しています。最後に$appenプロパティに作成したname属性を追加して完了です。Memberモデルにname属性が追加されました。では、 作成したname属性が取得できるかtinkerで確認してみましょう。

>>> App\Models\Member::find(1);
=> App\Models\Member {#4209
     id: "1",
     last_name: " tanaka",
     first_name: "ichiro",
     created_at: null,
     updated_at: null,
     +name: " tanaka ichiro",
   }

新たにname属性が現れ、値がtanaka ichiroであることがわかります。無事に属性追加に成功しました。

まとめ

今回はEloquentの属性追加を解説しました。モデルから取得した値を至るところで変換している場合は、属性の追加で対応すると良い感じにまとまります。表現豊かなモデルを作っていきましょう。

Laravel

Posted by kobainmac