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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
bemulima
Сообщения: 207
Зарегистрирован: 2012.12.20, 09:41
Откуда: Курган

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

Сообщение bemulima »

Здравствуйте! Есть таблица main_table:

|id_main_table|id_category|name|

, у нее есть несколько хвостов table_1, table_2, table_3 и т.д:

|id_table_x|id_main_table|...|...|...|

table_1, table_2, table_3 и т.д связаны с таблицей main_table один к одному. Есть отдельная таблица category:

|id_category|name|

В зависимости от категория соединяется хвост к главной таблице т.е.:

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

if($model->id_category === 1) $model->getTable_1()->one();
if($model->id_category === 2) $model->getTable_2()->one();
if($model->id_category === 3) $model->getTable_3()->one();
//и т.д.     
Создание:

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

public function actionCreate(){
        $model = new MainTable();
        if($model->load(Yii::$app->request->post()) && $model->save()){
            $transaction = Yii::$app->db->beginTransaction();
            if($model->id_category === 1 && Yii::$app->request->post('Table1')){
                $table1 = new Table1;
                $table1->attributes = Yii::$app->request->post('Table1');
                $table1->validate();
                
                if(!$table1->save())
                    $transaction->rollBack();
            }
            elseif($model->id_category === 2 && Yii::$app->request->post('Table2')){
                $table2 = new Table2;
                $table2->attributes = Yii::$app->request->post('Table2');
                $table2->validate();
                
                if(!$table2->save())
                    $transaction->rollBack();
            }
            elseif($model->id_category === 3 && Yii::$app->request->post('Table3')){...}
            ...//и т.д.
            $transaction->commit();
        }
    } 
Так сохраняется в бд. А вот, как быть с редактированием, пробую так:

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

public function actionUpdate(){
        $model = $this->findModel($id);
        if($model->load(Yii::$app->request->post()) && $model->save()){
            $transaction = Yii::$app->db->beginTransaction();
            if( $model->id_category === 1 && $model->getTable1()->one()->load(Yii::$app->request->post()) ){
                $table1 = $model->getTable1();//Unknown Method – yii\base\UnknownMethodException Calling unknown method: yii\db\ActiveQuery::save()
                if(!$table1->save()) $transaction->rollBack (); 
            }
            elseif( $model->id_category === 2 && $model->getTable2()->one()->load(Yii::$app->request->post()) ){
                $table2 = $model->getTable2();//Unknown Method – yii\base\UnknownMethodException Calling unknown method: yii\db\ActiveQuery::save()
                if(!$table2->save()) $transaction->rollBack ();
            }
            elseif()
                $transaction->commit();
        }
    } 
так не работает, где $table1 = $model->getTable1(); происходит ошибка

Unknown Method – yii\base\UnknownMethodException Calling unknown method: yii\db\ActiveQuery::save()

Что делаю не так?
Melodic
Сообщения: 87
Зарегистрирован: 2016.05.11, 17:43
Откуда: Луганск

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

Сообщение Melodic »

Вызываете метод save() не у того объекта.
godzie
Сообщения: 62
Зарегистрирован: 2016.04.03, 00:38

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

Сообщение godzie »

$table1 = $model->getTable1()->one();
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

Связь в getTable1() не кешируется, так что:

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

$table1 = $model->table1; 
Аватара пользователя
bemulima
Сообщения: 207
Зарегистрирован: 2012.12.20, 09:41
Откуда: Курган

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

Сообщение bemulima »

Благодарю всем, так и сделал.
Ответить