Невозможно редактировать другую табличную информацию об отношении hasOne в CakePHP

В приложении CakePHP мне нравятся две таблицы, одна из которых - пользователи, которым понравился hasOne Profile.

Мне удалось автоматически создать записи в обоих при создании нового пользователя, но когда я пытаюсь отредактировать все на моей странице редактирования пользователя, он создает новую запись профиля, в результате чего у моего пользователя есть 2 связанных профиля.

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

Вот мой user_controller.php с функцией редактирования, которая не работает должным образом:

function edit($id = null) {
    if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Invalid User', true));
            $this->redirect(array('action' => 'index'));
        }
        if (!empty($this->data)) {
            if ($this->User->save($this->data)) {
                $this->data['Profile']['user_id'] = $this->User->id;
                $this->User->Profile->save($this->data);
                $this->Session->setFlash(__('User saved', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('The user could not be saved. Please, try again.', true));
            }
        }
        if (empty($this->data)) {
            $this->data = $this->User->read(null, $id);
        }
    }

Большое спасибо за помощь!


person Gus Fune    schedule 29.06.2011    source источник


Ответы (1)


Что ж, судя по вашему коду, он делает именно то, что вы ему говорите. Он берет user.id и сохраняет с ним новый профиль.

Внешний вид вашего кода не устанавливает для $this->User->Profile->save() никаких условий. Вам также необходимо указать, в каком профиле сохранять правки. В противном случае Торт подумает, что вы хотите сохранить новый. Итак, если у вас есть идентификатор профиля в скрытом поле формы, он должен выглядеть примерно так

$this->User->Profile->save(
    $this->data,
    array(
        'conditions' => array(
             'Profile.id' => $this->data['Profile']['id']
        )
    )
);

Теперь вы должны обновлять определенный профиль, а не просто сохранять каждый раз новый.

Сообщите мне, работает это или нет.

Редактировать:

Подумав, это очень странно, что вы даже можете сохранить два профиля с одним и тем же идентификатором пользователя. Это должно было произойти на уровне базы данных еще до того, как оно было сохранено. Я бы порекомендовал настроить уникальный индекс для profiles.user_id, чтобы в будущем вы не столкнулись с проблемами, когда у пользователя есть несколько профилей.

(Если не предполагалось иметь несколько профилей с одним и тем же пользователем, и в этом случае игнорируйте редактирование!)

person Charles Sprayberry    schedule 29.06.2011
comment
Отлично, всегда рад, когда я отвечаю на самом деле, ну, ответы. - person Charles Sprayberry; 29.06.2011