- 更新日: 2016年3月8日
- PHP & CakePHP
CakePHPでカラム属性に別名/エイリアスを付ける仮想フィールド
CakePHP 3 でカラムの名前に別名(エイリアス)を付けて、カラム属性にアクセスしたい機会がありました。使いたかったのは、Rails の ActiveRecord で使える alias_attribute のような機能です。
— 環境 —
PHP 5.5.19
CakePHP 3.1.1
Rails の場合 alias_attribute で簡単にできる
Rails の場合、ActiveRecord のモデルで alias_attribute を使うと、簡単にカラムのエイリアスを設定できます。
以下、Post モデルの title カラムに、heading という名前のエイリアス(別名)でアクセスできるようにする例。
1 2 3 |
class Post < ActiveRecord::Base alias_attribute :heading, :title end |
これで、以下のように heading のエイリアスでも属性にアクセスできるようになります。
1 2 |
Post.first.title Post.first.heading |
CakePHP3 では仮想フィールドの機能を使う
上述と同じような機能を CakePHP 3 で実現するにはどうすれば良いのか調べたところ、CakePHP 3 の場合は、仮想フィールドという機能が使えるらしい。
これは、モデル(Entity)に規約に従った名前でアクセサーを定義すると、仮想フィールド(属性/プロパティ)として、存在しないフィールド・プロパティにアクセスできるようになる機能です。
仮想フィールドのためのアクセサーは、先頭に _get をつけたキャメルケースで定義し、仮想フィールドにアクセス時はスネークケースでアクセスします。
以下は、CakePHP 3 のマイグレーションで自動生成される、created, modified の datetime フィールドに別名(created_at, updated_at)を付ける例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
namespace App\Model\Entity; use Cake\ORM\Entity; class Post extends Entity { protected function _getCreatedAt() { return $this->_properties['created']; } protected function _getUpdatedAt() { return $this->_properties['modified']; } } |
これで、rails と同じような感じで、created_at, updated_at という属性名でアクセスできるようになる。
1 2 |
$post->created_at; $post->updated_at; |
仮想フィールドの応用例をいくつか
もう少し応用編で、いくつか書いてみた例を紹介します。仮想フィールドの機能は、単純に別名(エイリアス)を付けるだけでなく、ヘルパー的な使い方もできます。
完全な住所を返す仮想フィールド
Address モデル(addresses テーブル)が、prefecture, city, town というカラムを持っている例で、完全な住所(full_address)の仮想フィールドにアクセスするためのアクセサーを定義する例です。
1 2 3 4 5 6 7 8 9 |
class Address extends Entity { protected function _getFullAddress() { return $this->_properties['prefecture'] . $this->_properties['city'] . $this->_properties['town']; } } |
このアクセサーを定義したことで、以下のように仮想フィールドにアクセスできるようになります。
1 |
$address->full_address; |
任意の日時フォーマットを返す仮想フィールド
年月日(’Y-m-d’)のフォーマットで日時(datetime)属性にアクセスする仮想フィールドの例。
1 2 3 4 5 6 7 |
class Post extends Entity { protected function _getCreatedDate() { return date_format($this->_properties['created'], 'Y-m-d'); } } |
以下のようにアクセスできる。
1 |
$post->created_date; |
アソシーエション利用での仮想フィールド
User has many posts / Post belongs to user の関連となっているアソシエーションの例で、投稿されたポストのユーザー名が空の場合は、ユーザー名として「匿名希望」を出力するための仮想フィールド。
1 2 3 4 5 6 7 8 9 10 11 |
class Post extends Entity { protected function _getAuthor() { if ( empty($this->_properties['user']->name) ) { return '匿名希望'; } return $this->_properties['user']->name; } } |
これで $post->author でアクセスできる。投稿ポストのユーザー名が空っぽの場合は、「匿名希望」と出力されます。
以上、CakePHP 3 の仮想フィールドについてでした!
- PHP & CakePHP の関連記事
- PHP+MySQLでNo such file or directoryエラー
- bin/cakeコマンドでintlエラーが出る場合の対処(CakePHP)
- CakePHPアプリケーションをCapistranoでデプロイ
- Integrity constraint violation:Column ‘created’ in order clause is ambiguousエラー/CakePHP
- CakePHPでDB関連テーブルのレコード・データを取得
- CakePHPで日付選択フォームのカスタマイズ
- CakePHP3で現在のコントローラー名・アクション名を取得
- PHPインストールでconfigure: error: freetype.h not foundエラー
- CakePHPでログイン後に元のページにリダイレクトさせる
- CakePHPで全てのモデル/テーブル名一覧を取得
Leave Your Message!