CakePHP2ではモデルのafterFind()メソッドで検索結果の整形を行うことができました。
なんですが、CakePHP3ではなくなってしまったようです。
(参考)afterFind イベントやバーチャルフィールドはありません
https://book.cakephp.org/3/ja/appendices/orm-migration.html#afterfind
queryオブジェクトを整形してもダメです
つまりこういうことです
$query = $this->User->find('all'); $query[0]->fullname = $query[0]->first_name.$query[0]->last_name;
一見できそうですがこれはできません。
ですが、toArray()メソッドで配列にしてしまえば結果が確定するので大丈夫です。
$array = $this->User->find('all')->toArray();
でも、配列にしたくない場合ってありますよね。pagenate()使うときとか。
VirtualFiledっぽいやつ
VirtualFiledに似た感じだと下記の方法があります。
Entity/Users.php
namespace App\Model\Entity; use Cake\ORM\Entity; class User extends Entity { protected function _getFullName() { return $this->first_name . ' ' . $this->last_name; } }
Entityこんな感じで書くと
$this->User->full_name;
でアクセスできるようです。
use Cake\ORM\TableRegistry;してTableRegistry::getTableLocator()->get() を使えば、外部のモデルも参照できるので、外部のモデルを使ったデータも出せます。
外部のテーブルとか何か計算した結果などを入れるのに便利かと思います。
ただし、VirtualFiledと違って検索のキーにはできないようですので、そういう用途の場合はクエリビルダ―で何とかするほうがよさそうです。
結局のところ、virtualFiledsに相当するものはなさそうです。