Объединение таблиц

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
Dzhemal
Сообщения: 20
Зарегистрирован: 2014.11.18, 12:00

Объединение таблиц

Сообщение Dzhemal »

Совсем недавно рассматривалась похожая тема, и решил попробовать.
При регистрации пользователя хочу записывать доп инфу в отдельную таблицу. Насколько я понял, нужно создать доп модель со своей таблицей, и подключить это к уже имеющимся контроллеру и вьюшке. Если я правильно понял yii, то сначала подключается модель к контроллеру

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

use frontend\models\Profile;
...
...
 public function actionSignup()
    {
        $model = new SignupForm();
        $kis= new Profile();
        if ($model->load(Yii::$app->request->post())) {
            if ($user = $model->signup()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('signup', [
            'model' => $model, 'kis' =>$kis,
        ]);
    } 
Затем, прописал во вьюхе

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

<?php
            $form = ActiveForm::begin(['id' => 'form-signup']);
            $kis= new Profile();
            ?>
                <?= $form->field($model, 'username') ?>
                <?= $form->field($model, 'email') ?>
                <?= $form->field($model, 'password')->passwordInput() ?>
                <?= $form->field($kis, 'name') ?>
                <div class="form-group">
                    <?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?>
                </div>
            <?php ActiveForm::end(); ?>
сама же новоиспеченная модель через gii, в которой дописал наверняка ужасную function signUp выглядит следующим образом

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

<?php

namespace frontend\models;

use Yii;
use yii\db\ActiveRecord;

class Profile extends ActiveRecord
{
    public static function tableName()
    {
        return 'profile';
    }

    public function rules()
    {
        return [
            [['name', 'city'], 'required'],
            [['name', 'city'], 'string', 'max' => 32]
        ];
    }

    public function attributeLabels()
    {
        return [
            'user_id' => 'User ID',
            'name' => 'Name',
            'city' => 'City',
        ];
    }

    public function signUp()
    {
            if($this->validate()) {
                 $kis = new Profile();
                 $kis->name = $this->name;
                 $kis->city = $this->city;
                 $kis->save();
             }
        return null;
    }
} 
Пожалуйста помогите разобраться где ошибки? Всё работает точно так же как и раньше, но не сохраняет ничего в таблицу profile
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Объединение таблиц

Сообщение zelenin »

где вы присваиваете модели профиля ($kis) данные, полученные из формы?
Аватара пользователя
Dzhemal
Сообщения: 20
Зарегистрирован: 2014.11.18, 12:00

Re: Объединение таблиц

Сообщение Dzhemal »

Эм. Видимо нигде. Думал что в новой модели в функции

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

    public function signUp()
    {
            if($this->validate()) {
                 $kis = new Profile();
                 $kis->name = $this->name;
                 $kis->city = $this->city;
                 $kis->save();
             }
        return null;
    } 
А еще только сейчас прочитал, что несколько моделей во вьюхе подключаются не так как у меня, а вот таким образом:
http://www.yiiframework.com/doc-2.0/gui ... forms.html
Но пока не допер как в моей ситуации это сделать
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Объединение таблиц

Сообщение zelenin »

if ($model->load(Yii::$app->request->post())) { вот тут вы присваиваете данные для $model. Аналогично нужно для $kis, а потом сохранить.
Аватара пользователя
Dzhemal
Сообщения: 20
Зарегистрирован: 2014.11.18, 12:00

Re: Объединение таблиц

Сообщение Dzhemal »

Последовал Вашему совету, и дописал следующим образом

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

 public function actionSignup()
    {
        $model = new SignupForm();
        $kis= new Profile();
        if ($model->load(Yii::$app->request->post() && $kis->load(Yii::$app->request->post()))) {
            if ($user = $model->signup()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('signup', [
            'model' => $model, 'kis' =>$kis,
        ]);
    } 
теперь соответственно ничего не сохраняется. Дальше насколько я понимаю нужно менять представление и что-то в модели. Только что именно?(
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Объединение таблиц

Сообщение zelenin »

Dzhemal писал(а):Последовал Вашему совету, и дописал следующим образом

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

 public function actionSignup()
    {
        $model = new SignupForm();
        $kis= new Profile();
        if ($model->load(Yii::$app->request->post() && $kis->load(Yii::$app->request->post()))) {
            if ($user = $model->signup()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('signup', [
            'model' => $model, 'kis' =>$kis,
        ]);
    } 
теперь соответственно ничего не сохраняется. Дальше насколько я понимаю нужно менять представление и что-то в модели. Только что именно?(
хорошо, вы присвоили модели данные, полученные из формы. где вы их сохраняете?
Аватара пользователя
Dzhemal
Сообщения: 20
Зарегистрирован: 2014.11.18, 12:00

Re: Объединение таблиц

Сообщение Dzhemal »

Вроде как в новой модели

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

class Profile extends ActiveRecord 
{
...
...
public function signUp()
    {
            if($this->validate()) {
                 $kis = new Profile();
                 $kis->name = $this->name;
                 $kis->city = $this->city;
                 $kis->save();
             }
        return null;
    }
    } 
. Тогда так должно быть по идее?

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

 public function actionSignup()
    {
        $model = new SignupForm();
        $kis= new Profile();
        if ($model->load(Yii::$app->request->post() && $kis->load(Yii::$app->request->post()))) {
            if ($user = $model->signup() && $user=$kis->signUp()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            }
        }
        return $this->render('signup', [
            'model' => $model, 'kis' =>$kis,
        ]);
    } 
Но и так ничего не сохраняется
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Объединение таблиц

Сообщение zelenin »

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

if ($user = $model->signup() && $user=$kis->signUp()) {
                if (Yii::$app->getUser()->login($user)) {
                    return $this->goHome();
                }
            } 
вы сначала присваиваете $user результат работы $model->signUp, потом $kis->signup(), а потом $user преедаете в ->login().

Я вам объяснил принцип, но рекомендую последовательно обдумывать алгоритм своих действий.

Я не вижу смысла заводить отдельные методы для сохранения, тем более с такой логикой.

validate() уже вызывается в save().

внутри $kis вы создаете новый объект профиля с точно такими же данными, которые уже есть в $kis, то есть по сути клонируете.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Объединение таблиц

Сообщение zelenin »

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

if($model->load( ... ) && $model->validate()) {
    if($profile->load( ... ) && $profile->validate()) {
        $model->save();
        $model->link($profile);
    }
}
 
как-то так. почитайте документацию по activerecord для поннимания.
Ответить