save Allの便利な機能の中に、リレーションを張るとidを保管してくれる機能があります。
しかし、確認画面を挟むなどの理由でバリデーションだけをしたい時に、validatesをonlyとしてしまうと、idの補完は行われません。
なので、そのIDに依存するバリデーション条件が設定されている場合は、必ずエラーに成ってしまうので気をつけないといけません。
User hasone UserInfo
$data = array(
'User' = array(
'name' => 'waldo',
'tel' => 0123456789,
),
'UserInfo' = array(
'prefecture' => 'hokkaido',
'city' => 'sapporo',
),
);
$this->User->saveAll($data, $options);
この場合、UserInfo.user_idにinsertしたデータのUser.idが補完されてsaveされます。
$options = array('validates' => 'only');
$this->User->saveAll($data, $options);
とした場合は、上記の補完が適用されないため、user_idの存在の確認や、市外局番と住所の不一致などのバリデーションをuser_id経由で行えなくなります。(user_idが無いというエラーが出ます)
同様のことは
$options = array('validates' => 'first');
とした時にも一度onlyでバリデーションチェックをするので発生しますので注意してください。
解決方法
saveAllを使わない
idを補完したいということならsave後に$this->User->idでinsertしたIDを取得できるので、自前でsaveAll的なメソッドを作ってしまう。逐一、unsetなどができて自由度が高い。
atomic => false で外部トランザクションをかけて毎回ロールバックする
楽ちんだが、オートインクリメントされていくので、IDが飛び飛びになってしまうUserInfoバリデーション時にUserのPOST値を見に行く作りにする
UserInfoだけ追加でinsertしたい、updateしたいなどの時に、別途バリデーションを作らないといけない。冗長な作りになってくる
0 件のコメント:
コメントを投稿