📌

アクセサを使うときは本来取得する値とは別の名前をつけよう(laravel)

2021/06/14に公開

僕はLaravelでアクセサを頻繁に使うのですが、アクセサを使用する際は、本来取得する値とは別の名前をつけることをマイルールにしています。

まずは一応アクセサの共通認識をしておくと、アクセサは get〇〇Attribute というメソッドをモデルに書くことでDBからデータを取得する際にデータ加工ができるという優れものです。

まずは価格取得を例にアクセサを書いてみる

DBに itemsテーブルがありそこに price という金額をいれるカラムがあるとします。
priceには「10000」などの数字が入っていて、これを「10,000円」という風にカンマ区切り&円をつけるようにデータ加工したいとします。

その場合はこちらのように書きます。

class Item {
    .
    .
    .
    public funcion getPriceAttribute($value)
    {
        return number_format($value) . '円';
    }
    .
    .
    .
}

加工後のデータを取得したい場合は、普通にpriceにアクセスするだけです。

$item = Item::first()
$item->price;

ただしこれだと、本来のpriceの値(10000)を参照することはできません。
いくつかの商品のpriceの合計を計算しようとしたい場合は数値型のほうが絶対に計算しやすいのに、priceを参照しても「10,000円」という文字列が返ってきてしまいます。

なので、アクセサをつけるときは名前を変えることをマイルールにしています。

アクセサをつけるときは名前を変える

get〇〇Attribtueの〇〇の部分を変更して、 $appendsの中にいれてあげると、加工後のデータを取得することができます。

class Item {
    $appends = ['price_format'];
    .
    .
    .
    public funcion getPriceFormatAttribute()
    {
        return number_format($this->price) . '円';
    }
    .
    .
    .
}

この例でいうと、 price_format にアクセスすると加工後のデータが取得できます。

$item = Item::first();
$item->price; // 10000
$item->price_format; // 10,000円

終わりに

という、アクセサをつけるときは名前を別の名前にするというマイルールなのですが、いかがでしょうか。意外と加工前の元データを参照したいということは良くあるので、このルールはおすすめです。
当初は元データを参照する予定はなくても、後で参照する必要あるじゃーんっていうのが結構多いですので、最初から名前を分けておくと無難だと思います。

Discussion