Сохранение связанных таблиц

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Сохранение связанных таблиц

Сообщение Mongol »

Есть три таблицы, три модели. Связанные между собой: accounts->profiles->details.

При сохранении записи в accounts я использую следующий код

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

parent::afterSave();
        if ($this->isNewRecord) {
            $this->profiles = new Profile;
            $this->profiles->account_id = $this->id;
            if ($this->profiles->save(false)) {
                return true;
            }
        }
 
и новая запись в таблицу profiles добавляется как ожидалось. На этом этапе работает все правильно. Затем я по аналогии решил добавлять запись и details потому в модели Profile реализовал аналогичный код:

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

public function afterSave() {
            parent::afterSave();
            if ($this->isNewRecord) {
                $this->details = new Details;
                $this->details->profile_id = $this->account_id;
                if (!$this->details->save()) {
                    echo '<pre>';
                    print_r($this->details->erorrs);
                    exit;
                }
        }
    }
 
Но в данном случае метод afterSave вообще не вызывается. Даже если я удалю весь код и оставлю только

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

public function afterSave() {
            parent::afterSave();
            exit('dsadsadsa');
    }
 
или просто

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

public function afterSave() {
            exit('dsadsadsa');
    }
 
То ничего не происходит, словно данный метод вообще не существует. Помогите, в чем может быть дело.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Сохранение связанных таблиц

Сообщение flashimage »

попробуйте

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

$this->profiles->save(array('validate' => false, 'callbacks' => 
true)) 
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

Не помогло. Каким вообще способом вы сохраняете связанные данный если у вас каскад этих данных? Вот как у меня accounts->profiles->details. Все между собой связаны. Создавая accounts код должен создать profiles и details. Как бы вы это делали? Я так понял что это делается при помощи afterSave. Ну понятно что можно просто при помощи SQl или конструктора запросов, но как это делать при помощи CActiveRecord?
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Сохранение связанных таблиц

Сообщение demisang »

Mongol писал(а):Не помогло. Каким вообще способом вы сохраняете связанные данный если у вас каскад этих данных? Вот как у меня accounts->profiles->details. Все между собой связаны. Создавая accounts код должен создать profiles и details. Как бы вы это делали? Я так понял что это делается при помощи afterSave. Ну понятно что можно просто при помощи SQl или конструктора запросов, но как это делать при помощи CActiveRecord?

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

protected function afterSave() {
    if ($this->isNewRecord) {
        $this->profiles = new Profile;
        $this->profiles->account_id = $this->id;
        if ($this->profiles->save(false)) {

        }
    }

    parent::afterSave();
} 
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

Ничего не изменилось, но вы хоть бы ход своей мысли объяснили. Может я бы уже дальше сам докавырял
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Сохранение связанных таблиц

Сообщение demisang »

Mongol писал(а):Ничего не изменилось, но вы хоть бы ход своей мысли объяснили. Может я бы уже дальше сам докавырял
Свежим взглядом сейчас глянул, ведь у вас в методе "После сохранения" идёт проверка на то, что это isNewRecord, ведь после сохранения это уже будет не new model. поэтому

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

if ($this->isNewRecord) 
в вашем случае всегда будет возвращать false
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

Вы какой метод имеете ввиду, в какой именно модели? У меня их две :)
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

Дело в том, что если вы говорите о модели Profile, то проверка не имеет смысла, так как вызов этого метода не происходит вообще, в этом то и проблема, я не могу понять почему не происходит вызов метода. А если речь идет о модели Account, то даже если я убираю эту конструкцию результат прежний. Создается строка в Accounts, Profiles, а в Details по прежнему пусто без вывода каких либо ошибок
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Сохранение связанных таблиц

Сообщение demisang »

т.е. в точности так же делаете
Account:

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

protected function afterSave() {
    $newProfile = new Profile;
    $newProfile->account_id = $this->id;
    if ($newProfile->save(false)) {
        CVarDumper::dump($newProfile->details, 10, true);
    } else {
        CVarDumper::dump($newProfile->errors, 10, true);
    }

    parent::afterSave();
}
Profile:

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

protected function afterSave() {
    $newDetails = new Details;
    $newDetails->profile_id = $this->account_id;
    if (!$newDetails->save()) {
        CVarDumper::dump($newDetails->errors, 10, true);
    }

    parent::afterSave();
} 
Details:

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

protected function afterSave() {
    echo 'Мы дошли до details';
    die;

    parent::afterSave();
}
плз скопируй в вставь в свой код то, что я выше привёл, и скажи каков будет результат.
сделай всё в точности как я написал, ничего не меняй местами
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Сохранение связанных таблиц

Сообщение Nafania »

Есть такая штука - withReleatedBehavior - я думаю вам поможет.
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

demisang, у меня вообще ошибка строка 72, модель Account.
Изображение
С моей точки зрения это логично ведь модель details на этом этапе не создана, это у вас апечатка или у меня косяки в коде?
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Сохранение связанных таблиц

Сообщение demisang »

Mongol писал(а):demisang, у меня вообще ошибка строка 72, модель Account.
Изображение
С моей точки зрения это логично ведь модель details на этом этапе не создана, это у вас апечатка или у меня косяки в коде?
Ну эту строчку могли бы и исправить =) сделайте вместо неё просто echo '123';
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

Как и ожидалось, срабатывает код в блоке $newProfile->save(). (выводится 123). То есть профиль сохраняется, так же как и было изначально. Не пойму честно говоря ход вашей мысли и что мы пытаемся этим выявить? Изначально все так и было. Все в этом блоке отлично работает. У меня не срабатывает afterSave в модели профиля, не смотря на то, что сам Save срабатывает, в этом то и проблема. Я не могу понять почему не срабатывает.

То что вы говорите (могли бы и исправить), понятно что мог бы, если бы я понимал ход вашей мысли))
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Сохранение связанных таблиц

Сообщение demisang »

Mongol писал(а):Как и ожидалось, срабатывает код в блоке $newProfile->save(). (выводится 123). То есть профиль сохраняется, так же как и было изначально. Не пойму честно говоря ход вашей мысли и что мы пытаемся этим выявить? Изначально все так и было. Все в этом блоке отлично работает. У меня не срабатывает afterSave в модели профиля, не смотря на то, что сам Save срабатывает, в этом то и проблема. Я не могу понять почему не срабатывает.

То что вы говорите (могли бы и исправить), понятно что мог бы, если бы я понимал ход вашей мысли))
Не могу я ход мыслей изложить :D
Выкладывайте полностью файлы моделей сюда в одном архиве, если после того, что я выше писал, у вас выводится только echo '123' то проблема где-то в самих моделях: например в моделе Details есть функция своего валидатора, в которой забыли стереть exit; , надо глядеть на весь файл...
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

echo 123 не выводится совсем. Оно выводится только если после echo указать exit;
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Сохранение связанных таблиц

Сообщение demisang »

Mongol писал(а):echo 123 не выводится совсем. Оно выводится только если после echo указать exit;
Ну а если не использовать afterSave, если просто в контроллере независимо создать сначала аккаунт, профиль и детаилс? совместно с каждым ->save() делаейте проверку else print_r($model->errors). Попробуйте все возможные варианты, попробуйте при $account->save(false) не указывать false, поищите в каждой моделе слова die, exit, Yii::app()->end() и убедитесь, что они не мешают, используйте методы beforeSave() для модели профилей и детаилс чтобы проверить, срабатывают ли они, изучите правила rules эти моделей, убедитесь что они не создают ошибок.

Я могу ещё варианты предложить, но это всё равно что воду сечь...
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

Все из вышеперечисленного я уже попробовал в доль и поперек. И парметры в save передавал и не передавал. Ситуация та же, понятно что можно в контроллере независимо создать запись, просто не ясно почему нельзя этого сделать при помощи ActiveRecord.
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Сохранение связанных таблиц

Сообщение demisang »

Mongol писал(а):Все из вышеперечисленного я уже попробовал в доль и поперек.
Как я уже говорил - файлы в студию
Mongol
Сообщения: 27
Зарегистрирован: 2013.02.10, 22:01

Re: Сохранение связанных таблиц

Сообщение Mongol »

Все дело было в названии модели - Profile. Сменил название на UserProfile и все чудно заработало. Мне хочется разбить компьютер. :D
Ответить