У меня две таблицы: Users
и Clients
Вызов таблицы пользователей выглядит следующим образом:
id (primary) username(varchar) password, client_id
Теперь моя таблица клиентов выглядит так:
user_id, client_id(primary), is_new
Связь между ними определяется следующим образом:
class User extends AppModel { public $name = 'User'; public $hasOne = array( 'Client' =>array( 'className' => 'Client', 'dependent' => true, 'foreignKey' => 'client_id' ) ); } class Client extends AppModel { public $name = 'Client'; public $primaryKey = 'client_id'; public $belongsTo = array( 'User' => array( 'className' => 'User', 'dependent' => true, 'foreignKey' => 'user_id' ) ); }
Теперь в моем usercontroller у меня есть следующее действие сохранения:
if ($this->request->is('post')) { $data = null; $client_id = null; if ($this->request->data['User']['group_id'] == 1) { $client_id = 2; } elseif ($this->request->data['User']['group_id'] == 2) { $client_id = $this->request->data['User']['Client id']; } $data = array('User' => array( 'username' => $this->request->data['User']['username'], 'password' => $this->request->data['User']['password'], 'group_id' => $this->request->data['User']['group_id'], 'client_id' => $client_id), 'Client' => array('client_id' => $client_id) ); if ($this->User->save($data)) { $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.')); } } $groups = $this->User->Group->find('list'); $this->set(compact('groups')); }
Когда я сохраняю новый объект, добавляется в таблицу users с правильным client_id, но ничто не было добавлено в таблицу клиентов.
Может ли кто-нибудь сказать мне, почему это происходит?
Обратите внимание, что я попытался изменить функцию saveAll();
Обновить
Если я сделаю следующее:
$data = array( 'User' => array( 'username' => $this->request->data['User']['username'], 'password' => $this->request->data['User']['password'], 'group_id' => $this->request->data['User']['group_id'], 'client_id' => $client_id ), 'Client' => array('client_id' => $client_id) ); if ($this->User->Client->saveAll($data)) { }
Aka используйте $this->User->Client->saveAll
вместо $this->User->saveAll()
Все отлично работает.
Теперь это хорошо, но разве это так?
Используйте $this->User->saveAssociated($data)
вместо $this->User->save($data)
Обновить
Просто установите данные для клиента без идентификатора поля, как показано ниже, чтобы сохранить данные при сохранении пользователя.
$data = array( 'User' => array( 'username' => $this->request->data['User']['username'], 'password' => $this->request->data['User']['password'] ), 'Client' => array( 'field1' => 'field1value', 'field2' => 'field2value', 'field3' => 'field3value' ) );
Да, они оба одинаковы, только разница между ними заключается в том, что saveAssoicated используется, когда вам нужно одновременно сохранять связанные модели, тогда как saveAll является оболочкой saveAssociated,
Вы можете использовать saveAssociated
$ This-> User-> saveAssociated ($ данные)
а также saveAll ()
$ This-> User-> SaveAll ($ данные)
благодаря