過去にPhalcon4にバージョンアップしたときにModel周りの更新がうまく行かなくなったことがありました。
この問題に当たってから時間が経ってしまったので実際の動作を忘れてしまいましたがこの辺気にすると良いよ程度で書いておきます。
概要
Phalconを4にバージョンアップした。
参照系は動くけど、更新がなんかされない。saveメソッドはtrueが返ってくる。
対応1 - ModelのkeepSnapshotsまたはuseDynamicUpdateを有効にする。
Phalcon3系まではModelのデータを取得したあとに何かデータが更新されれば、過去のデータと照らし合わせて更新されるような形が取られてました。
しかし4系からはkeepSnapshotsというオプションを有効にしないと過去のスナップショットが保持されず、更新がされません。
class User extends Model
{
public function initialize()
{
$this->keepSnapshots(true);
}
}
useDynamicUpdate
でもこのkeepSnapshots
のオプションは有効になるので、以前のバージョンからuseDynamicUpdate
を利用している場合は影響はないでしょう。
対応2 - リレーションのreusableオプションを有効にする
リレーション先のデータを更新しようとする際にはreusableオプションを有効にしてないとデータの更新がされません。
$this->hasMany('id', UserPost::class, 'user_id', [
'alias' => 'posts',
'reusable' => true, // ←これ
]);
ついでに、resusable
を有効にしてないと毎回リレーション先データを取ってきてしまうのでデフォルトで有効にしておいてほしいですね。。。
また、3系では以下のようにデータが更新できました。
$user = User::find(1);
$user->userCard->token = $token;
$user->save();
しかし、4.0や4.1.0では更新されません。
この件に関しては以下のissueを立てました。
内部のコードを見るとわかりますが、リレーション先がdirtyかどうかをチェックしてないようです。