Entityを手動で書き換えたら保存されない場合は?

スポンサーリンク
CakePHP

CakePHPのEntityの仕組みは、わかれば便利なんですが、知らないとちょっと困る場合が多いです。
patchEntity()を通してEntityを生成する場合は問題ないのですが、手動でEntityを書き換えた場合はいろいろハマるポイントがおおいですね。

いつもやり方を忘れてしまうので記事にしてみました。

バージョン

CakePHP3系およびCakePHP4系

問題点

usersとuser_profilesがHasOneであったとします。Entityの生成はこんな感じですね。

$userEntity = $this->Members->patchEntity($userEntity,$this->request->getData());

Entityのプロパティーを変えるときはこんな感じでEntity::set()メソッドをつかいます。

$userEntity->set('status',1);
$userEntity->user_profile->set('hoge',1);
で問題はここから。
これでSaveしてもuser_profileの方の変更が保存されません。
なぜかというと、これだけでは変更が通知されていないから。
実は、内部でフィールドごとに変更があったかどうかのフラグがあって、そのフラグが立っていたら保存するというような処理になっています。
これはEntity::set()メソッドでプロパティーを書き換えたときにフラグが立ちます。
ですが、associatedされたテーブルに関してはアソシエーション元のフィールドの書き換えフラグが立っていませんので、更新されないのです。

解決策

ということで書き換えたよフラグを立てなければいけませんが、それにはEntity::setDirty()メソッドを使います。
こんな感じで。
$userEntity->setDirty('user_profile',true);

CakeBookにも一応書いてあるんだけど、いまいち意味が分かりにくいんですよね。というわけで記事にしてみました。

この仕様いつも忘れちゃって今まではpatchEntity()のところでどうにかしたり、いちいち調べたりしていて面倒だったので記事にしてみました。

PHPエンジニアにおくるCakePHP3予習入門: バージョン 3.8 対応 | 辛島信芳 | 一般・入門書 | Kindleストア | Amazon
Amazonで辛島信芳のPHPエンジニアにおくるCakePHP3予習入門: バージョン 3.8 対応。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。
タイトルとURLをコピーしました