DEVELOPERS BLOGデベロッパーズブログ

  1. HOME > 
  2. 加藤 正人のデベロッパーズブログ > 
  3. CakePHP 3.x の accessor と mutator 【その2】

加藤 正人のデベロッパーズブログ

加藤 正人

氏名
加藤 正人
役職
多分SE
血液型
秘密
出没
美味しいもののあるところ
特色
タヒチ大好き。ちょいメタボ。

加藤 正人

2016/09/10

CakePHP 3.x の accessor と mutator 【その2】

 

前回の mutator に続き、今回は accessor を取り上げてみる。

Accessor

accessor はデータを取得 (access) する際に、データを変更や改変する機構である。この機構を利用することで、データベースに格納されているデータをもとに変形・変更したデータを取得することができる。

例えば、会員データベースを考えてみる。会員データには生年月日を登録し、会員データを表示する際にはその時点の年齢に変換して表示するような場合にこの機能が役立つ。

CakePHP 2.x では、afterFind() コールバックメソッドでフィールドごとに必要な処理を記述して対応していた。

※別の方法としては、仮想フィールドで SQL 式を記述する方法もあったが、本件については後述する。

afterFind() コールバックメソッド内では当該フィールドの存在をチェックし、存在していた場合の処理 (上記の場合は年齢を計算し 'age' という新しい要素として結果配列に追加) を行なう。

一方 CakePHP 3.x では afterFind() コールバックメソッドは廃止されており、代わりに Entity クラスに導入された accessor を使用する。

accessor は使用するフィールド名ごとに決まった名称のメソッドが割り当てられる。その中に当該フィールドに関わる処理だけを記述するので可読性と保守性が高い。アクセスするフィールドの存在チェックは CakePHP システムが行なうため accessor 内に記述する必要はない。

Accessor と仮想フィールド

accessor では既存のフィールドの書き換えることも可能だが、上記のように既存のフィールドを変換して別フィールドとして利用することもできる。本来のデータベールレコードにはないフィールドを生成しものを「仮想フィールド」 (virtual field) と呼ぶ。

ただし、CakePHP 2.x の仮想フィールド (virtual field) では SQL 文レベルで操作する方法であった。例えば、姓フィールドと名フィールドを文字列結合してフルネーム仮想フィールドを定義する場合、モデル内で

$this->virtualFields['fullname'] = "CONCAT({$this->alias}.family_name, {$this->alias}.given_name)";

のようにできた。

一方 3.x の場合は、SQL 文の実行結果オブジェクト (Entity オブジェクト) に対する操作であるため仮想フィールドがアクセスされるのは SQL 文の処理が終わった後である。このため、3.x では SQL 文内で仮想フィールドを利用することはできない点が異なる。

このため、3.x の場合で CakePHP システムの動作するサーバーとデータベースサーバーが異なるマシンの場合、現在時刻など個々のシステム依存のリソースを利用する仮想フィールドでは同じ値を利用できないことがあるので注意を要する。

関連タグ: CakePHP3 

関連エントリー

CakePHP3 のリダイレクトがうまく行かない例

PhpSpreadsheet でExcel ファイルを読み込む (CakePHP3)

CakePHP3 のユーザー定義ファインダーのオプション

PHP3 でデバグモードを一旦無効化した後再度有効化するとDebugKit が見つからない

CakePHP3 で JSON 応答のための定番処理

CakePHP3 でタイムゾーン変換

バージョンを指定して CakePHP をインストールする

CakePHP サイトの移転時の注意

CakePHP3 のアソシエーションで、紐づけ用フィールドを指定する

CakePHP3 のコマンドライン実行

CakePHP3 の Virtual Field と accessor (Getter)

CSRF token mismatch

2019/07/04
CSRF token mismatch

CakePHP3 で created と modified に日付が自動付与されない場合のメモ

CakePHP3 で

CakePHP3 の JSON 出力でエラー

CakePHP3 のミューテータで書き換えたデータが保存されない件

CakePHP3.6.2 のタイムスタンプ調整 (XSERVER の場合)

CakePHP3 で DebugKit が表示されない

最新版 composer.phar のインストール

PHP 7.x で CakePHP 3.x を使う

Remi's PHP5.6 と intl モジュール

X2 と CakePHP 3.x

2017/05/23
X2 と CakePHP 3.x

CakePHP3 の便利機能

CakePHP3 と SQLite

2017/02/20
CakePHP3 と SQLite

CakePHP3 でテーブル不使用フォームのバリデーション

CakePHP3 のファインダーメソッド

CakePHP 3.x の accessor と mutator

XSERVER X10 に CakePHP 3.x をインストールする

XSERVER で CakePHP 3.x が Fatal error

CakePHP 3.x インストールメモ

Composer メモ

2015/06/13
Composer メモ