0
0

More than 3 years have passed since last update.

Phalcon4にバージョンアップしたあとにDBの更新系が動かなくなったら

Posted at

過去に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かどうかをチェックしてないようです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0