九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、Laravel 5.7
がリリースされた関係で、最近は主に新しい機能についての記事を公開してきましたが、この辺でLaravelの基本的な機能についても深く掘り下げてみたくなりました。
そして、今回の基本的な機能は、Accessor(アクセッサー)
です。
Accessorとは、DBから取得したデータを自動的に加工することができる機能です。
例えば、以下のようにuser_code
などとして、ゼロで埋められたコードを取得できるようにする場合ですね。
$user = \App\User::find(1); $user->user_code; // 例: 0001
これの何がいいかと言うと、一度Accessorを作っておくと、後でいちいちデータ加工するコードを書くことなく、自動的に調整された正しいデータを取得できるようになるからです。
ということで、今回はそんなAccessorの便利な実例をケース別でまとめることにしました。ぜひ参考にしてくださいね。
Accessorを設定するには
まずはAccessorを設定する基本的な方法です。
Accessorを設定するには、モデルの中にget***Attribute()
というメソッドを追加するだけでOKです。
例えば、getUserCodeAttribute()
などですね。
つまり、Accessorは、
- メソッド名がgetで始まる
- メソッド名がAttributeで終わる
というルールに従って作成する必要があります。
そして、実際にデータ取得する場合は、以下のようにget
とAttribute
を抜かした名前で呼び出せばOKです。
$user->user_code; // 例: 0001 // もしくは $user->userCode;
では、次からはこのAccessorを使って以下のような機能を実装するコードを紹介していきましょう。
- 都道府県IDから都道府県名
- 名字と名前を結合したフルネーム
- 西暦から和暦への変換
よく使うAccessor実例
都道府県IDから都道府県名を取得する
検索が高速になるなどのメリットがあるため、開発ではよく都道府県名ではなくJIS規格の都道府県IDを使うケースがありますが、いちいち都道府県名が入った連想配列から該当データを取得するコードを書くのは面倒です。
そんなときは以下のようなAccessorを使って自動化するといいでしょう。(都道府県IDがprefecture_id
というフィールド名の場合)
public function getPrefectureNameAttribute() { $prefs = [ '1' => '北海道', '2' => '青森県', '3' => '岩手県', '4' => '宮城県', '5' => '秋田県', '6' => '山形県', '7' => '福島県', '8' => '茨城県', '9' => '栃木県', '10' => '群馬県', '11' => '埼玉県', '12' => '千葉県', '13' => '東京都', '14' => '神奈川県', '15' => '新潟県', '16' => '富山県', '17' => '石川県', '18' => '福井県', '19' => '山梨県', '20' => '長野県', '21' => '岐阜県', '22' => '静岡県', '23' => '愛知県', '24' => '三重県', '25' => '滋賀県', '26' => '京都府', '27' => '大阪府', '28' => '兵庫県', '29' => '奈良県', '30' => '和歌山県', '31' => '鳥取県', '32' => '島根県', '33' => '岡山県', '34' => '広島県', '35' => '山口県', '36' => '徳島県', '37' => '香川県', '38' => '愛媛県', '39' => '高知県', '40' => '福岡県', '41' => '佐賀県', '42' => '長崎県', '43' => '熊本県', '44' => '大分県', '45' => '宮崎県', '46' => '鹿児島県', '47' => '沖縄県' ]; return array_get($prefs, $this->prefecture_id); }
都道府県IDが13
のデータで実行すると「東京都」が取得できます。
$user->prefecture_name; // 東京都
また、逆に名前から都道府県IDを取得する場合は以下のようになります。(都道府県名のフィールド名がprefecture
の場合)
public function getPrefectureIdAttribute() { $prefs = [ '1' => '北海道', '2' => '青森県', '3' => '岩手県', '4' => '宮城県', '5' => '秋田県', '6' => '山形県', '7' => '福島県', '8' => '茨城県', '9' => '栃木県', '10' => '群馬県', '11' => '埼玉県', '12' => '千葉県', '13' => '東京都', '14' => '神奈川県', '15' => '新潟県', '16' => '富山県', '17' => '石川県', '18' => '福井県', '19' => '山梨県', '20' => '長野県', '21' => '岐阜県', '22' => '静岡県', '23' => '愛知県', '24' => '三重県', '25' => '滋賀県', '26' => '京都府', '27' => '大阪府', '28' => '兵庫県', '29' => '奈良県', '30' => '和歌山県', '31' => '鳥取県', '32' => '島根県', '33' => '岡山県', '34' => '広島県', '35' => '山口県', '36' => '徳島県', '37' => '香川県', '38' => '愛媛県', '39' => '高知県', '40' => '福岡県', '41' => '佐賀県', '42' => '長崎県', '43' => '熊本県', '44' => '大分県', '45' => '宮崎県', '46' => '鹿児島県', '47' => '沖縄県' ]; return array_search($this->prefecture, $prefs); }
$user->prefecture_id; // 13
名字と名前を結合したフルネームを取得する
会員データを管理する場合、「名字」と「名前」を分けてデータ保存しておく場合も多いでしょう。例えば、first_name
とlast_name
のようなフィールド名です。
では、この2つのデータを結合してfull_name
としてフルネームが取得できるようにしてみましょう。
public function getFullNameAttribute() { return $this->first_name .' '. $this->last_name; }
これを実行すると以下のようになります。
$user->full_name; // 山田 太郎
年齢に「歳」を追加する
会員データの年齢は通常数値として保存されていますが、表示する場合は「20歳」と単位をつけることもあります。そんな場合も「歳」を自動的に付加するAccessorを作成しておくと便利です。
public function getUnitAgeAttribute() { return $this->age .'歳'; }
$user->unit_age; // 20歳
血液型に「型」を付加する
例えば、会員データに血液型を保存する場合、「A」「B」などとして保存ことがあるでしょう。そして、そういったデータに「A型」と単位も追加するようにします。
public function getUnitBloodTypeAttribute() { return $this->blood_type .'型'; }
$user->unit_blood_type; // A型
長さデータに「cm」をつける
例えば、会員データの身長に「cm」単位を付加したい場合です。
public function getUnitHeightAttribute() { return $this->height .'cm'; }
$user->unit_height; // 168cm
重さのデータに「kg」をつける
例えば、会員の体重に「kg」単位を付加したい場合です。
public function getUnitWeightAttribute() { return $this->weight .'kg'; }
$user->unit_weight; // 55kg
西暦から和暦に変換する
例えば、birth_yearというフィールドに誕生年が入っていて、これを「平成●●年」など元号つきに変換するAccessorです。
public function getBirthWarekiYearAttribute() { $year = $this->birth_year; $wareki_year = 0; if ($year >= 2019) { $era_name = '(新元号)'; $wareki_year = $year - 2018; } else if ($year >= 1989) { $era_name = '平成'; $wareki_year = $year - 1988; } else if ($year >= 1926) { $era_name = '昭和'; $wareki_year = $year - 1925; } else if ($year >= 1912) { $era_name = '大正'; $wareki_year = $year - 1911; } else { $era_name = '明治'; $wareki_year = $year - 1867; } $wareki_year = ($wareki_year == 1) ? '元' : $wareki_year; return $era_name . $wareki_year .'年'; }
$user->birth_wareki_year; // 「平成元年」「昭和60年」など
※ちなみに、2019年からは元号が変更する予定ですが、まだ新しい元号が決まっていないので、現時点では(新元号)
としています。
※また、有効なのは明治以降の和暦です。
3桁カンマを付加した数値を取得する
例えば、DB内にamount
という金額を保存する数値フィールドがあったとします。そして、この数値データから「1,000,000」というような3桁ごとにカンマをふったデータを取得したい場合です。
public function getCommaAmountAttribute() { return number_format($this->amount); }
$user->comma_amount; // 10,000
もし「円」も追加したい場合はこうなります。
public function getYenAmountAttribute() { return number_format($this->amount) .'円'; }
$user->yen_amount; // 10,000円
消費税の金額を取得する
例えば、amount
というフィールドに合計金額が数値データとして入っていて、この金額の消費税がいくらなのかを取得したい場合です。
public function getAmountTaxAttribute() { $tax_percentage = 8; return floor($this->amount * $tax_percentage * 0.01); }
$user->amount_tax; // 800(金額が10,000の場合)
※ ちなみに消費税はどんどん上がっていく傾向にありますので、config/app.php
などのコンフィグファイルか、もしくはDB内に税率を格納していつでも変更が可能にしておくことをおすすめします。
また、消費税を含んだ合計金額を取得する場合はこうなります。
public function getAmountIncludingTaxAttribute() { $tax_percentage = 8; $amount = $this->amount; return $amount + floor($amount * $tax_percentage * 0.01); }
$user->amount_including_tax; // 10800
管理者としての権限があるかどうかを取得する
例えば、ユーザーデータの中にrole
というadmin
(管理者)や、user
(通常ユーザー)といった種類が保存されていて、このデータを元に管理者権限があるかどうかを判別する場合です。
public function getHasPermissionAttribute() { return ($this->role == 'admin'); }
使い方は、以下のようになります。
if($user->has_permission) { // 管理者権限あり }
「0001」のようなゼロで埋められたユーザーコードを取得する
例えば、id
番号をゼロで埋められた4桁のコードを取得したい場合です。
public function getUserCodeAttribute() { return str_pad($this->id, 4, '0', STR_PAD_LEFT); }
$user->user_code; // 0001
郵便番号を結合して取得する
サイトによりますが、郵便番号のデータを例えばfirst_postal_code
とlast_postal_code
というように2つに分けて管理している場合があります。そんな場合にこれらを結合したfull_postal_code
として取得します。
public function getFullPostalCodeAttribute() { return $this->first_postal_code .'-'. $this->last_postal_code; }
$user->full_postal_code; // 131-0045
GoogleマップのURLを取得する
例えば、会員データに住所が保存されていて、その場所をGoogleマップで表示する場合に必要なURLを取得したい場合です。
public function getGoogleMapUrlAttribute() { return 'https://www.google.co.jp/maps/place/'. urlencode($this->address); }
$user->google_map_url; // https://www.google.co.jp/maps/place/%E6%9D%B1%E4%BA%AC%E9%83%BD%E5%A2%A8%E7%94%B0%E5%8C%BA%E6%8A%BC%E4%B8%8A%EF%BC%91%E4%B8%81%E7%9B%AE%EF%BC%91%E2%88%92%EF%BC%92
役職名を取得する
例えば、position_id
という役職名マスターのIDを保存しているフィールドがあるとして、ここから実際の役職名を取得したい場合です。
public function getPositionNameAttribute() { $positions = [ 1 => '会長', 2 => '社長', 3 => '副社長', 4 => '専務', 5 => '常務', 6 => '支社長', 7 => '本部長', 8 => '部長', 9 => '次長', 10 => '室長', 11 => '課長', 12 => '係長', 13 => '主任' ]; return array_get($positions, $this->position_id); }
$user->position_name; // 会長
部署名を取得する
例えば、section_id
という部署IDを保存するフィールドから実際の部署名を取得したい場合です。
public function getSectionNameAttribute() { $sections = [ 1 => '総務部', 2 => '人事部', 3 => '経理部', 4 => '営業部', 5 => '開発部', 6 => '事業部', 7 => '製造部' ]; return array_get($sections, $this->section_id); }
$user->section_name; // 開発部
ファイルのダウンロード
今回実際に使用したプログラム・コードをダウンロードできます。
ぜひご自身の開発に役立ててください。
おわりに
ということで今回はLaravelの強力な便利機能Accessorにフォーカスして記事を書いて見ました。
はやりこの機能があるだけで、開発のスピードを上げることができるでしょうし、何か変更点があってもAccessor部分を変更すれば全てのコードに反映させることができるので保守管理にもプラスといっていいでしょう。
また、特に汎用的によく使うAccessorは、トレイトにまとめて他のモデルで共有してもいいかもしれません。
class User extends Authenticatable { use AccessorTrait; // 省略 }
trait AccessorTrait { // ここにAccessor }
できるだけコードは一回書くだけで使い回しができるようにしておけば、次の開発ではよりスピーディな対応ができるようになります。ぜひ活用してくださいね。
ではでは〜。