ポイント
- saveAll の第2引数で、array(‘deep’ => true) を設定する。
具体例
次のような場合を考えます。
- User hasOne Profile
- Profile hasOne ExProfile
- フォームで User、 Profile そして ExProfile のデータを入力します。
- このような形のデータを保存します。
Array ( [User] => Array ( [id] => 1 [username] => adminuser [password] => adminuser [group_id] => 1 ) [Profile] => Array ( [id] => [catch_phrase] => アイエエエエエエエエエエエエエエ!? [self_introduction] => ドーモ、adminuser デス。 [ExProfile] => Array ( [id] => [job] => ニンジャ [address] => ネオサイタマ ) ) )
ソース
app/Controller/UsersController.php
<?php App::uses('AppController', 'Controller'); /** * Users Controller * * @property User $User */ class UsersController extends AppController { /** * edit method * * @throws NotFoundException * @param string $id * @return void */ public function edit($id = null) { $this->User->id = $id; if (!$this->User->exists()) { throw new NotFoundException(__('Invalid user')); } if ($this->request->is('post') || $this->request->is('put')) { // 入力フォームの値のみを保存するため、それら以外の post データを排除する。 $save_data['User']['id'] = $this->request->data['User']['id']; $save_data['User']['username'] = $this->request->data['User']['username']; $save_data['User']['password'] = $this->request->data['User']['password']; $save_data['User']['group_id'] = $this->request->data['User']['group_id']; $save_data['Profile']['id'] = $this->request->data['Profile']['id']; $save_data['Profile']['catch_phrase'] = $this->request->data['Profile']['catch_phrase']; $save_data['Profile']['self_introduction'] = $this->request->data['Profile']['self_introduction']; $save_data['Profile']['ExProfile']['id'] = $this->request->data['Profile']['ExProfile']['id']; $save_data['Profile']['ExProfile']['job'] = $this->request->data['Profile']['ExProfile']['job']; if ($this->User->saveAll($save_data, array('deep' => true))) { $this->Session->setFlash(__('The user has been saved')); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The user could not be saved. Please, try again.')); } /* */ } else { $this->User->recursive = 2; $this->request->data = $this->User->read(null, $id); } $groups = $this->User->Group->find('list'); $this->set(compact('groups')); } }
おわりに
次のページが参考になりました。「For saving a record along with its related records having hasMany association and deeper associated Comment belongsTo User data as well, the data array should be like this:」の部分です。ありがとうございます。