Как правильно использовать populateRelation ? [Решено]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Как правильно использовать populateRelation ? [Решено]

Сообщение nepster »

Делайю экшин регистрации:

Код: Выделить всё

    public function actionSignup()
    {
        $user = new User(['scenario' => 'signup']);
        $profile = new Profile();
        
        if ($user->load(Yii::$app->request->post()) && $profile->load(Yii::$app->request->post())) {
            if ($user->validate() && $profile->validate()) {
                
                $user->populateRelation('profile', $profile);
                
                if ($user->save(false)) {
                    if ($this->module->requireEmailConfirmation === true) {
                        Yii::$app->session->setFlash('success', Yii::t('users.flash', 'SUCCESS_SIGNUP_WITHOUT_LOGIN', [
                            'url' => Url::toRoute('resend')
                        ]));
                        Yii::$app->consoleRunner->run('users/send-mail ' . $user->id . ' signup');
                    } else {
                        Yii::$app->user->login($user);
                        Yii::$app->session->setFlash('success', Yii::t('users.flash', 'SUCCESS_SIGNUP_WITH_LOGIN'));
                    }
                    return $this->redirect('login');
                } else {
                    Yii::$app->session->setFlash('danger', Yii::t('users.flash', 'FAIL_SIGNUP'));
                    return $this->refresh();
                }
            } else if (Yii::$app->request->isAjax) {
                Yii::$app->response->format = Response::FORMAT_JSON;
                return ActiveForm::validate($user);
            }
        }

        return $this->render('signup.twig', [
            'user' => $user,
            'profile' => $profile
        ]);
    }
У нас есть 2 таблицы: User и Profile

Форма регистрации использует как поля модули User так и поля модели Profile.

Валидация проходит все ок. Когда доходит дело до сохранения, я пытаюсь добавить профиль вот таким образом:

Код: Выделить всё

$user->populateRelation('profile', $profile);
И налетаю на ошибку:

Код: Выделить всё

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`test`.`profiles`, CONSTRAINT `FK_profile_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
The SQL being executed was: INSERT INTO `profiles` (`name`, `surname`, `whau`) VALUES ('Иван', 'Иванов', 'Соц. Сети')
Тоесть запрос не допиливает user_id.

Собственно реляция в модели User и Profile есть.

Подкажите пожалуйста как решить проблему ?
Последний раз редактировалось nepster 2014.11.30, 22:41, всего редактировалось 1 раз.

Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Как правильно использовать populateRelation ?

Сообщение Insolita »

Вы однако хотите сделать

Код: Выделить всё

$user->link('profile', $profile); 
- это сохранит Модель profile и привяжет соответсвенно связи по id, только делать это надо после сохранения модели User

Код: Выделить всё

$user->populateRelation('profile', $profile); 
- только добавит модель профиля к модели юзера в массив связей данной модели, которые можно получить $model->getRelationRecords()
Последний раз редактировалось Insolita 2014.11.27, 15:11, всего редактировалось 1 раз.

Аватара пользователя
TranceSmile
Сообщения: 562
Зарегистрирован: 2011.06.27, 19:04
Откуда: Украина
Контактная информация:

Re: Как правильно использовать populateRelation ?

Сообщение TranceSmile »

у меня была данная проблема. решилось удалением primary key. Сделал просто user_ id integer.
Изображение

Аватара пользователя
Insolita
Сообщения: 788
Зарегистрирован: 2011.06.06, 01:39
Контактная информация:

Re: Как правильно использовать populateRelation ?

Сообщение Insolita »

TranceSmile писал(а):у меня была данная проблема. решилось удалением primary key. Сделал просто user_ id integer.
кардинально

nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Как правильно использовать populateRelation ?

Сообщение nepster »

Спасибо, оставил populateRelation и дописал идентификатор.

Krash
Сообщения: 29
Зарегистрирован: 2016.04.19, 12:43

Re: Как правильно использовать populateRelation ?

Сообщение Krash »

nepster писал(а):Спасибо, оставил populateRelation и дописал идентификатор.
Но, тогда populateRelation() и не нужен вроде? Я все не пойму для чего же populateRelation() нужен.

Ответить