エンジニ屋.com(エンジニヤドットコム)

分かりやすくを意識して情報発信!

【Laravel 】get~Attributeの使い方【わかりやすく解説】


f:id:enginiya:20220220005059p:plain

当記事では初級者から上級者まで必ず覚えておきたいアクセサと呼ばれるget~Attributeの使い方について、実際のコードを使用して解説していきます。

get~Attributeを使用すれば、データベースから取得した後のデータを加工して簡単にView(Blade)で表示させたい時に便利です。

「データに一定の処理を加える必要があればget~Attribute」というほど実務でも頻繁に使っているので、ぜひ使い方を覚えておきましょう。

アクセサ(get~Attribue)とは


get~Attribue は、データに処理を加えるメソッドです。

例えば、「1」というデータを3桁で「001」 というように0を埋めて表示させてたいときや、「2022-02-10 10:00」というデータを「2022-02-10」の形式に変更したい場合など、データベース上のデータの形を変えて表示させる使い方が可能です。

アクセサ(get~Attribue)を実際に書いてみよう


get~Attribueを使ってデータを取得するには、ModelファイルでAttribute定義を記述して、View側(Blade)でAttributeで定義したメソッドをControllerファイルでModelインスタンスで取得したデータの変数を通して、表示させるという流れとなります。

準備段階から説明を書いていくと長くなり要点からずれてしまうので、下記ファイルは既に用意されているものとしてrouteからviewまでの連携はされている前提として話を進めます。

※MVCの理解はある程度必要となります。

app/Models/Test.php
app/Https/Controllers/TestController.php
resources/views/index.php

(サンプルデータ)
テーブル名:tests

id name
1 サザエ
2 ジャムおじ
3 バタコ



実装その①

1つ目にシンプルな例として、データベースのnameを呼び出したときに名前の後ろに「さん」が表示されるような実装を書いていきたいと思います。

get~Attributeは以下のように記述します。

app/Models/Test.php

public function getNameSanAttribute()
    {
        $name = $this->name;
        
        return  $name . "さん";
    }

解説

1行目のfunctionでメソッド名を決めます。 メソッド名にはルールがあります。

  1. キャメルケースで書く
  2. データベースのカラム名と同じにしない

3行目の$this→nameで$nameにデータベースのnameのフィールド内のデータを取得して格納しています。

5行目のreturnで$nameの後ろに「さん」を付与して値を返しています。

app/Https/Controllers/TestController.php

public function index ()
    {
        $records = Test::get();
        return view( 'index', compact('records'));
    }

解説

ここでは、特に特別な処理はしていません。 4行目のTest::get() でModelを通してtestsテーブルからの全データを変数$recordsに格納しています。 6行目でviewで用意しているindex.blade.phpに変数を渡しいます。

resources/view/test.blade.php

@foreach ( $records as $rec) 
  {{ $rec->name_san }}
@endforeach

解説

1行目でforeachを使用して、全データのレコードを順に取得しています。 2行目の->(アロー演算子)でAttributeへアクセスしています。 アクセスする際は、Modelファイルでキャメルケースで定義していたメソッド名を_(アンダースコア)を使用します。

表示結果

サザエさん ジャムおじさん バタコさん

思い通り、名前の後ろ全てに「さん」がついて表示されました。

一応確認の為、Attribute を使用しないパターンを見てみます。

resources/view/test.blade.php

@foreach ( $records as $rec) 
  {{ $rec->name}}
@endforeach

解説

先程、name_sanとAttributeを使用していた部分を単にデータベースで使用しているカラム名に変更しました。

表示結果

 サザエ ジャムおじ バタコ

単にデータベース内のデータが表示されるので「さん」はついていません。



実装その②

もう1つシンプルな例として、データベースから取得したIDの番号を3桁で0埋めで表示させてみたいと思います。

get~Attributeは以下のように記述します。

app/Models/Test.php

public function getZeroPaddingIdAttribute()
    {
        $id  = sprintf('%03d',$this->id);
        return $id;
    }

解説

functionでメソッド名を定義しています。

3行目でsprinf関数を使用しています。 spritfについて、ここでは詳しく説明しませんが指定のフォーマットを作ることができる便利な関数です。 (第一引数に%0桁数d)(第2引数に0埋めしたい数字)を当てることで、0埋めが実現できます。

では、view(blade)を以下のように記述します。

resources/view/test.blade.php

@foreach ( $records as $rec) 
  {{ $rec->zero_padding_id }}
@endforeach

解説

キャメルケースをアンダースコアに変換して記述しています。

表示結果

001 002 003

idを3桁表示の0で埋めることが出来ました。

一応通常の表示も確認しておきます。

resources/view/test.blade.php

@foreach ( $records as $rec) 
  {{ $rec->id }}
@endforeach

表示結果

1 2 3

idのそのままのデータが表示されました。



まとめ

get〜Attributeに加えたい処理を技術するだけで表示させたいようにView(blade)で簡単に表示ができました。

当記事で紹介した具体例は、とてもシンプルな処理でしたが、if文と組み合わせてある条件の時だけ表示させたり、他のデータがある条件だけ処理を加えたりなど様々な使い方できます。

実務的な応用例も別記事で追って紹介していきたいと思います。