Модель сохранения CakePHP и связанная с ней модель

У меня есть модель пользователя.

Он имеет представление регистрации, содержащее форму, которая выглядит следующим образом:

echo $this->Form->create('User',array(NULL,NULL,'class' => 'signinform'));
echo $this->Form->input('first_name');
...
echo $this->Form->end('Create Account');

Когда вы отправляете форму, она сохраняется так:

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

Это работает.


Я добавил в свою базу данных таблицу под названием addresses с полем user_id, которое является внешним ключом для users.id.

Я вставил свою модель пользователей:

var $hasMany = 'Address';

Я добавляю такие поля в форму регистрации:

echo $this->Form->input('Address.city');

Я ожидал, что это создаст новую запись в таблице адресов и свяжет ее с новым пользователем. Это не так, он создает нового пользователя, но ничего не помещает в таблицу адресов.

Я попытался изменить функцию сохранения с save на saveAll:

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

Теперь ничего не сохраняется.

Что я делаю неправильно?


person JD Isaacks    schedule 16.02.2011    source источник


Ответы (2)


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

<?php
function add() {
    if (!empty($this->data)) {
        // We can save the User data:
        // it should be in $this->data['User']

        $user = $this->User->save($this->data);

        // If the user was saved, Now we add this information to the data
        // and save the Profile.

        if (!empty($user)) {
            // The ID of the newly created user has been set
            // as $this->User->id.
            $this->data['Profile']['user_id'] = $this->User->id;

            // Because our User hasOne Profile, we can access
            // the Profile model through the User model:
            $this->User->Profile->save($this->data);
        }
    }
}
?>

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

person Don Kirkby    schedule 16.02.2011
comment
Это работает, но возникает вопрос: если сохранить пользователя удалось, но не удалось сохранить адрес/профиль — что делать? Вернув их в форму, вы снова попытаетесь создать нового пользователя. - person JD Isaacks; 17.02.2011
comment
Если это произойдет, @John, я бы перенаправил их на экран для редактирования только что созданного пользователя и отобразил ошибку в виде мгновенного сообщения. В качестве альтернативы вы можете использовать транзакцию, чтобы обе вставки были успешными или неудачными вместе: book.cakephp.org/ просмотр/1633/Транзакции - person Don Kirkby; 17.02.2011

Вам также может понадобиться поместить это в модель адреса:

var $belongsTo = 'User';

person Ramon Marco L. Navarro    schedule 16.02.2011