@sacred1

Сохранение связанных данных yii1 (active record)?

Всем доброго времени суток. Совсем недавно начал разбираться с yii, поэтому не обессудьте. Например у нас есть две таблицы. Первая таблица authors с полями - `id`(pk),`name`,`surname`, вторая таблица posts с полями - `post_id`,`post` и `author_id` где это поля является внешним ключом (on delete cascade on update cascade). И собственно вопрос, как при добавление данных, добавить последний этот самый id из таблицы authors в таблицу posts поля author_id.
Как я пытался и у меня не получилось,сам контроллер:
$model_authors = new Authors;
$model_posts= new Posts;
        if(isset($_POST['Authors ']) && isset($_POST['Posts '])){

            $model_authors ->attributes=$_POST['Authors '];
            $model_posts->attributes=$_POST['Posts '];
            $model_posts->author_id = $model_authors->id;
       }

В самом контроллере, напрочь не получается подцепить этот идентификатор(id), банально его не видит, когда var_dump смотрю, на то что он сохраняет.
Так же пытался и через afterSave в самой модели. Модель authors:
protected function afterSave(){
        parent::afterSave();
        $post= new Posts;
        $post->author_id = $this->id;
        $post->save();
    }

Здесь же если смотреть через var_dump $this->id это как разный и есть наш lastinsertid, но почему сохранение так же не происходить.
Буду очень признателен если разъясните!
  • Вопрос задан
  • 2539 просмотров
Пригласить эксперта
Ответы на вопрос 2
В первом случае ДО сохранения модели $model_authors у неё не существует id(если это MySQL и id автоинкрементный).
Второй случай должен работать, тут уже надо смотреть модель Posts, может не проходит валидация или что ещё в это роде.
Ответ написан
DanteXXI
@DanteXXI
Web-Developer
Посмотрите в сторону Transactions в yii. В результате, будет что-то типа вот этого (на работоспособность не проверял):
$author = new Author();
$post = new Post();
if (isset($_POST["Post"]) && isset($_POST["Author"])) {
    $author->setAttributes($_POST["Author"]);
    $post->setAttributes($_POST["Post"]);
    if ($author->validate()) {
        $transaction = $author->getDbConnection()->beginTransaction();
        try {
            $author->save();
            $transaction->commit();
            $post->author_id = $author->author_id;
            if ($post->validate()) {
                $post->save();
                $transaction->commit();
            }
            else {
                $transaction->rollback();
            }
        }
        catch(Exception $e) {
            $transaction->rollback();
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы