CakePHPでカラム属性に別名/エイリアスを付ける仮想フィールド

スポンサーリンク

CakePHP 3 でカラムの名前に別名(エイリアス)を付けて、カラム属性にアクセスしたい機会がありました。使いたかったのは、Rails の ActiveRecord で使える alias_attribute のような機能です。

— 環境 —
PHP 5.5.19
CakePHP 3.1.1

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

Rails の場合 alias_attribute で簡単にできる

Rails の場合、ActiveRecord のモデルで alias_attribute を使うと、簡単にカラムのエイリアスを設定できます。

以下、Post モデルの title カラムに、heading という名前のエイリアス(別名)でアクセスできるようにする例。

これで、以下のように heading のエイリアスでも属性にアクセスできるようになります。

CakePHP3 では仮想フィールドの機能を使う

上述と同じような機能を CakePHP 3 で実現するにはどうすれば良いのか調べたところ、CakePHP 3 の場合は、仮想フィールドという機能が使えるらしい。

これは、モデル(Entity)に規約に従った名前でアクセサーを定義すると、仮想フィールド(属性/プロパティ)として、存在しないフィールド・プロパティにアクセスできるようになる機能です。

仮想フィールドのためのアクセサーは、先頭に _get をつけたキャメルケースで定義し、仮想フィールドにアクセス時はスネークケースでアクセスします。

以下は、CakePHP 3 のマイグレーションで自動生成される、created, modified の datetime フィールドに別名(created_at, updated_at)を付ける例です。

これで、rails と同じような感じで、created_at, updated_at という属性名でアクセスできるようになる。

仮想フィールドの応用例をいくつか

もう少し応用編で、いくつか書いてみた例を紹介します。仮想フィールドの機能は、単純に別名(エイリアス)を付けるだけでなく、ヘルパー的な使い方もできます。

完全な住所を返す仮想フィールド

Address モデル(addresses テーブル)が、prefecture, city, town というカラムを持っている例で、完全な住所(full_address)の仮想フィールドにアクセスするためのアクセサーを定義する例です。

このアクセサーを定義したことで、以下のように仮想フィールドにアクセスできるようになります。

任意の日時フォーマットを返す仮想フィールド

年月日(’Y-m-d’)のフォーマットで日時(datetime)属性にアクセスする仮想フィールドの例。

以下のようにアクセスできる。

アソシーエション利用での仮想フィールド

User has many posts / Post belongs to user の関連となっているアソシエーションの例で、投稿されたポストのユーザー名が空の場合は、ユーザー名として「匿名希望」を出力するための仮想フィールド。

これで $post->author でアクセスできる。投稿ポストのユーザー名が空っぽの場合は、「匿名希望」と出力されます。

以上、CakePHP 3 の仮想フィールドについてでした!

スポンサーリンク
私は Ruby on Rails の前は、PHP & CakePHP を使っていました(今も使いますけど)。PHP についてはオライリーの本を中心に軽く10冊以上は読み込みました。
 
スポンサーリンク

Leave Your Message!