スポンサーリンク

[CakePHP3.x]CakePHP2にあったafterFind()やvirtualFiledsはどこに行った?

CakePHP3.x

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に相当するものはなさそうです。