2013-09-19 2 views
0

У меня есть две таблицы Users и ClientsCakePHP сохранить оленья кожа сохранить ассоциированные моделируют

пользователей таблица struckture выглядит следующим образом:

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' 
     ) 
    ); 
} 

Теперь в моем UsersController у меня есть следующие действия сохранения:

 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')); 
} 

Когда я сохранить новый объект добавляется в таблицу пользователей с правильным client_id, но ничего не было добавлено в таблицу клиентов.

Может ли кто-нибудь сказать мне, почему это происходит?

Обратите внимание, что я пытался изменить функцию saveAll();

Update

Если я сделать следующее:

 $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)) { 
} 

Ака использовать $this->User->Client->saveAll вместо $this->User->saveAll()

Все хорошо работает ..

Теперь это хорошо, но так ли должно быть?

+0

почему вы не используете '$ this-> User-> сохранить ($ this-> request-> данные)', вместо того, чтобы эффективно скопировать его в другую переменную?С точки зрения кода вам будет лучше помещать этот код в модельную функцию, чтобы код контроллера был просто '$ this-> User-> register ($ this-> request-> data);' - Fat models, тонкие контроллеры – AD7six

+0

@ AD7six единственная причина, по которой я делаю это, потому что есть только 1 случай, когда мне нужно жестко кодировать мой client_id (это имеет какое-то отношение к доступу к моей программе), это может быть преобразовано в модель, я согласен хотя – Marc

+1

'$ this-> request-> data ['Client'] ['client_id'] = $ foo' сделал бы это - похоже, что это нужно делать только иногда, хотя бы 2 строки кода вместо ~ 14 – AD7six

ответ

1

Использование $this->User->saveAssociated($data) вместо $this->User->save($data)

Update

Просто установите данные для клиента без поля ид, как, как показано ниже Симметричного для сохранения данных при сохранении пользователя.

$data = array(
    'User' => array(
     'username' => $this->request->data['User']['username'], 
     'password' => $this->request->data['User']['password'] 
    ), 
    'Client' => array(
     'field1' => 'field1value', 
     'field2' => 'field2value', 
     'field3' => 'field3value' 
    ) 
); 
+0

Если я это сделаю, я получу 2013-09-19 11:43:52 Ошибка: [PDOException] SQLSTATE [23000]: Нарушение ограничения целостности: 1062 Дублирующая запись '0' для ключа 'PRIMARY', что означает, что он не сможет найти мой client_id – Marc

+0

Просто попробовать, как это может работать '$ данных = массив ( \t 'User' => Array ( 'имя пользователя' => $ this-> request-> данные [ 'User'] [ 'имя пользователя'], ' password '=> $ this-> request-> data [' User '] [' password '], ' group_id '=> $ this-> request-> data [' User '] [' group_id '], ' client_id '=> $ client_id ), «Клиент» => массив() ); ' –

+0

Это избавило от ошибки sql, но ничего не вставило в таблицу клиентов (иначе мы вернемся к началу) – Marc

1

Да они оба же, только разница между ними заключается в том, что saveAssoicated используется, когда необходимо сохранить связанные модели сразу, тогда как SaveAll является оберткой saveAssociated,

Вы можете использовать saveAssociated

$this->User->saveAssociated($data)

, а также SaveAll()

$this->User->saveAll($data)

Благодаря

Смежные вопросы