Не могу редактировать другую информацию таблицы для отношения hasOne в CakePHP - PullRequest
1 голос
/ 29 июня 2011

Мне нравится 2 таблицы в приложении CakePHP, одна из них - это пользователи, которым понравился один профиль.

Мне удалось автоматически создать записи в обоих при создании нового пользователя, но, когда я пытаюсь изменить все на своей странице редактирования пользователя, он создаст новую запись профиля, в результате чего у моего пользователя будет связано 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);
        }
    }

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

1 Ответ

1 голос
/ 29 июня 2011

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

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

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

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

Дайте мне знать, работает ли он или нет.

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

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

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

...