hasOneをbindModelで繋いでsaveAssociateするとき、
bindModelの第二引数にfalseを設定して永続化しないと途中でbindが切れる。
原因
繋がっている各テーブルに対しUPDATEその他諸々が走るため。
一つの$this->Model->saveAssociate()でも実際のクエリに対してbindModelのフォーカスは決まるっぽい
hasOneのアソシエーションを保存するとき実際に走るクエリ
AuthorTable ->hasOne-> AccountTableの時の例
7つもクエリが走っている
- トランザクション開始
- AuthorTableの存在チェック(validate用)
- AuthorTableの存在チェック(save用)
- AuthorTableの更新
- AccountTableの存在チェック(validate用)
- AccountTableの存在チェック(save用)
- AccountTableのの更新
- トランザクションコミット
1 |
[0] => Array |
cakeの仕様だが、validateとsaveで二回も存在チェックする必要はあるだろうか。いや、ない。
補足 複数のSELECT COUNT(*)について
cakephp2ではsaveでもvalidateでも、hasAnyの時でさえも存在チェックとしてSELECT COUNT()を使う。
$Model->find()の時ですら件数取得としてSELECT COUNT()を使う。
すでにvalidatesメソッドでSELECT COUNT()していようが、saveの時にまたSELECT COUNT()を使う。
詳しくはVendor/cakephp/cakephp/lib/Cake/Model.php
やVendor/cakephp/cakephp/lib/Cake/ModelBehavior.php
に。