はじめに
view側で見たことない属性へアクセスしているなあと思って色々調べていたら、Laravelのアクセサという機能を使っている事が判明。
その時に調べた内容・理解したことを記事にしています。
アクセサとは
アクセサを定義するには、アクセスしたいカラム名が「studlyケース(Upper Camel Case)」でFooの場合、getFooAttributeメソッドをモデルに作成します。以下の例では、first_name属性のアクセサを定義しています。first_name属性の値にアクセスが起きると、Eloquentは自動的にこのアクセサを呼び出します。
要するに、データベースから取得した値を加工したいときに使うもの。
アクセサの使い方
サンプルデータ
テーブル名: items
商品テーブルに数量、単価のカラムを用意
id | quantity | unitprice |
---|---|---|
1 | 2 | 1000 |
2 | 1 | 3 |
購入商品の合計金額が表示されるように実装を書いていきます。
Modelの準備
まずは、Modelでアクセサ(get〜Attribute)を定義します。
public function getTotalItemPriceAttribute()
{
return $this->unitprice * $this->quantity;
}
アクセサ定義で気をつけること
- キャメルケースで定義する(今回だとTotalItemPriceの部分)
- 予期せぬ挙動を回避するため、DBのカラム名を使用しない
Controllerの準備
次はControllerでItemデータを取得してviewに値を渡します。
public function index()
{
$items = Items::get();
return view('index', compact('items'));
}
Viewの準備
最後に定義したアクセサを呼び出します。
@foreach ( $items as $item )
{{ $item->total_item_price }}
@endforach
アクセサの呼び出しは、Modelファイルで定義したアクセサ名(getTotalItemPriceAttribute)からget
とAttribute
を除いたメソッドのスネークケース(total_item_price)で呼び出せます。