【Laravel】アクセサの使い方

はじめに

Laravelのアクセサを使うことで、モデルのプロパティ(テーブルのカラム)を、オリジナルの値から別の値に変換して取得することが可能となります。

本記事では、このアクセサの利用例を解説します。

目次

環境

  • Laravel 5.5.45

事例

例えば、ブログに付けられたコメントの公開が、ブログ管理者による承認制であるブログシステムがあったとして、各コメントが承認済であるかどうかが、commentsテーブルのapproved_at(承認日時)カラムの値の有無で判断できるとします。

approved_at(承認日時) 承認状況
null 未承認
値あり 承認済

もし、ビュー(Blade)側で、承認済の場合にのみ特定のコンテンツを表示するような制御を行うとすれば、一例として以下のようなロジックが考えられます。

@if (!is_null($comment->approved_at))
<p>
  <!-- 承認済の場合にのみ表示するコンテンツ -->
</p>
@endif

ここで、より直感的に承認済かどうかを判断可能なis_approvedをアクセサを使って実装してみます。

アクセサの実装

モデルに、以下の通りgetIsApprovedAttributeというメソッドを作成します。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    public function getIsApprovedAttribute(): bool
    {
        return $this->approved_at ? true : false;
    }
}

このようにget〜Attributeといった形式で名付けられたモデルのメソッドがアクセサになります。

そして、このアクセサを利用するには、getAttributeを取り除いたスネークケースで記述します。

先ほどのビュー(Blade)で利用するのであれば、以下のようになります。

@if ($comment->is_approved)
<p>
  <!-- 承認済の場合にのみ表示するコンテンツ -->
</p>
@endif

アクセサの利点

もちろん、アクセサではなく、以下のようなisApprovedメソッドを作ったとしても、同等の効果は得られると思いますが、

    public function isApproved(): bool
    {
        return $this->approved_at ? true : false;
    }
  • ->isApproved()

ではなく、

  • ->is_approved

といったように、モデルのプロパティ(テーブルのカラム)と同じ感覚で呼び出せるのが、アクセサの良いところのひとつではないかと思います。

余談

なお、先ほど、

そして、このアクセサを利用するには、getとAttributeを取り除いたスネークケースで記述します。

と書きましたが、実はスネークケースとなるis_approvedだけではなく以下のいずれの記述でもアクセサとして利用できます。

  • isApproved
  • IsApproved
  • isapproved
  • ISAPPROVED
  • i_s_a_p_p_r_o_v_e_d

柔軟ですね・・・。

参考