Страница 1 из 1

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

Добавлено: 2017.03.08, 20:39
Никита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 добавляемого пользователя?

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

Добавлено: 2017.03.08, 20:59
caHek2x
сначала сохраняете пользователя ... а потом link

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

Добавлено: 2017.03.08, 21:17
Никита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;
        }
    }

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

Добавлено: 2017.03.08, 22:02
Никита096
А быть может правильнее использовать в таких случаях afterSave() с транзакциями? Подскажите кто что может, link() возвращает false.

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

Добавлено: 2017.03.08, 22:39
za4me
Никита096 писал(а): 2017.03.08, 21:17

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

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

После:

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

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

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

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

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

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

$profile->link();

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

Добавлено: 2017.03.08, 22:47
caHek2x
вы заглядывали в исходники/документацию ? или от балды делаете ?
link что то вам должен возвращать ?

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

Добавлено: 2017.03.09, 06:10
leonenco
Вам обьясняют что если сохранение User не прошло (вернуло False) то все условие

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

$user->save() && $profile->link('user', $user)
сразу вернет False. Посмотрите если экземпляр User класса сохраняется.

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

Добавлено: 2017.03.09, 06:18
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";
}

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

Добавлено: 2017.03.09, 08:37
Никита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;
    }
Багодарю всех за разъяснение.

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

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

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

Добавлено: 2017.03.09, 10:22
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 никакого нету ...

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

Добавлено: 2017.03.09, 14:39
Никита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-ом вывел. Спасибо что открыли глаза:)

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

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