Не може да редактира друга информация за таблица за връзка hasOne в CakePHP

Имам 2 харесани таблици в приложението CakePHP, едната е Users, която 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() според вида на вашия код. Трябва да посочите и какъв профил да запазите редакциите. В противен случай Кейк ще си помисли, че искате да запазите нов. Така че, ако имате ID на профила в скрито поле на формуляр, той трябва да изглежда по следния начин

$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