Сохранение связанных данных в БД

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Никита096
Сообщения: 28
Зарегистрирован: 2017.02.01, 17:23

Сохранение связанных данных в БД

Сообщение Никита096 »

Приветствую всех. Хелп плиз.
Есть стандартные модели User, Profile, SignupForm.
Связи между моделями User и Profile есть.

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

class SignupForm extends Model
{
    public $name;
    public $email;
    public $username;
    public $password;
    public $confirmPassword;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
        //User
            [['name', 'email', 'username', 'password', 'confirmPassword'], 'required'],
            [['username', 'password', 'confirmPassword', 'name', 'email'], 'string', 'max' => 100],
            [['username', 'name'],'trim'],
            ['username', 'unique', 'targetClass' => User::className()],
            ['confirmPassword', 'compare', 'compareAttribute' => 'password'],
            ['email','email'],
        ];
    }

    public function signup()
    {
        if ($this->validate()){
            $user = new User();
            $profile = new Profile();
            $user->username = $this->username;
            $user->email = $this->email;
            $user->setPassword($this->password);
            $user->generateAuthKey();
            $profile->user_id = ????
            $profile->name = $this->name;
            return ($user->save() && $profile->save()) ? true : false;
        }
    }
}
В документации описывается метод link();
Например: link('user', $user);
Написано что он делает тоже самое что и:
$profile->user_id = $user->id;
$profile->save();
Линком сохраняется user_id, а т.к. выше, нет. Откуда link() знает какой id у пользователя? Что за магия?
Откуда взять id добавляемого пользователя?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Сохранение связанных данных в БД

Сообщение caHek2x »

сначала сохраняете пользователя ... а потом link
Никита096
Сообщения: 28
Зарегистрирован: 2017.02.01, 17:23

Re: Сохранение связанных данных в БД

Сообщение Никита096 »

caHek2x писал(а): 2017.03.08, 20:59 сначала сохраняете пользователя ... а потом link
У меня было так. Линком сохранял, но почему-то возвращал false именно из-за него.

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

public function signup()
    {
        if ($this->validate()){
            $user = new User();
            $profile = new Profile();
            $user->username = $this->username;
            $user->email = $this->email;
            $user->setPassword($this->password);
            $user->generateAuthKey();
            $profile->name = $this->name;
            return ($user->save() && $profile->link('user', $user)) ? true : false;
        }
    }
Никита096
Сообщения: 28
Зарегистрирован: 2017.02.01, 17:23

Re: Сохранение связанных данных в БД

Сообщение Никита096 »

А быть может правильнее использовать в таких случаях afterSave() с транзакциями? Подскажите кто что может, link() возвращает false.
Аватара пользователя
za4me
Сообщения: 152
Зарегистрирован: 2016.06.26, 15:29
Контактная информация:

Re: Сохранение связанных данных в БД

Сообщение za4me »

Никита096 писал(а): 2017.03.08, 21:17

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

$user->save() && $profile->link('user', $user)
Если ваш код возвращает false, значит неверно отрабатывается условие.

После:

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

$user->save();
Будет доступен id сохраненной строки:

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

$user->id; // return 5
Если требуется сохранение более чем в одну таблицу, я бы использовал транзикции. Благо в yii2 они отлично реализованы и просто применяются.

Покажите метод

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

$profile->link();
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Сохранение связанных данных в БД

Сообщение caHek2x »

вы заглядывали в исходники/документацию ? или от балды делаете ?
link что то вам должен возвращать ?
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Сохранение связанных данных в БД

Сообщение leonenco »

Вам обьясняют что если сохранение User не прошло (вернуло False) то все условие

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

$user->save() && $profile->link('user', $user)
сразу вернет False. Посмотрите если экземпляр User класса сохраняется.
Аватара пользователя
leonenco
Сообщения: 155
Зарегистрирован: 2017.01.30, 22:42

Re: Сохранение связанных данных в БД

Сообщение leonenco »

А также чтоб получить user id только что сохраненого

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

$profile->user_id = ????
можно через

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

$profile->user_id = $user->getPrimaryKey();
НО, его можно получить только после сохранения User.

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

if($user->save()){
	$profile->user_id = $user->getPrimaryKey();
} else {
	return "An Error while saving user";
}
Никита096
Сообщения: 28
Зарегистрирован: 2017.02.01, 17:23

Re: Сохранение связанных данных в БД

Сообщение Никита096 »

caHek2x писал(а): 2017.03.08, 22:47 вы заглядывали в исходники/документацию ? или от балды делаете ?
link что то вам должен возвращать ?
link(); //return boolean
Вероятно из-за вложенного в него save().

Экземпляр user сохраняется return true.
Хотя и profile сохраняется тоже, link возвращает false, хз почему.

В итоге:

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

public function signup()
    {
        if ($this->validate()){
            $user = new User();
            $user->username = $this->username;
            $user->email = $this->email;
            $user->setPassword($this->password);
            $user->generateAuthKey();
            if ($user->save()){
                $profile = new Profile();
                $profile->user_id = $user->getPrimaryKey();
                $profile->name = $this->name;
                return $profile->save() ? true : false;
            }
        }
        return false;
    }
Багодарю всех за разъяснение.
Krash
Сообщения: 29
Зарегистрирован: 2016.04.19, 12:43

Re: Сохранение связанных данных в БД

Сообщение Krash »

Никита096 писал(а): 2017.03.09, 08:37 Хотя и profile сохраняется тоже, link возвращает false, хз почему.
Потому что линк ничего не возвращает.
public void link ( $name, $model, $extraColumns = [] )
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Сохранение связанных данных в БД

Сообщение caHek2x »

Никита096 писал(а): 2017.03.09, 08:37
caHek2x писал(а): 2017.03.08, 22:47 вы заглядывали в исходники/документацию ? или от балды делаете ?
link что то вам должен возвращать ?
link(); //return boolean
Вероятно из-за вложенного в него save().
вы этот комментарий сами придумали ?
http://www.yiiframework.com/doc-2.0/yii ... k()-detail
link может только исключение сгенерировать но return boolean никакого нету ...
Никита096
Сообщения: 28
Зарегистрирован: 2017.02.01, 17:23

Re: Сохранение связанных данных в БД

Сообщение Никита096 »

caHek2x писал(а): 2017.03.09, 10:22
Никита096 писал(а): 2017.03.09, 08:37
caHek2x писал(а): 2017.03.08, 22:47 вы заглядывали в исходники/документацию ? или от балды делаете ?
link что то вам должен возвращать ?
link(); //return boolean
Вероятно из-за вложенного в него save().
вы этот комментарий сами придумали ?
http://www.yiiframework.com/doc-2.0/yii ... k()-detail
link может только исключение сгенерировать но return boolean никакого нету ...
Сами сами.. Косяк, разобрался, теперь вижу что null. gettype-ом вывел. Спасибо что открыли глаза:)
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Сохранение связанных данных в БД

Сообщение caHek2x »

Никита096 писал(а): 2017.03.09, 14:39 Сами сами.. Косяк, разобрался, теперь вижу что null. gettype-ом вывел. Спасибо что открыли глаза:)
та даже gettype выводить не надо ... перед вами всегда есть исходники/документация ... да и если не в блокноте пишите нажали на метод(зажав ctrl) и вас сразу перекинет в исходники ... и там все понятно и доступно ... и видно что никаких return нету ...
Ответить