首页 > 解决方案 > 当我刷新页面时,我的应用程序继续将数据插入数据库 Yii2

问题描述

有动作

public function actionEfetuarPedidoReserva($idQuarto){
    $modelPedidoReservaQuarto = new PedidoReservaQuarto();
    $modelPedidoReserva = new PedidoReserva();
    $model = new ComodidadesExtra();
    $modelListaComodidades = new ListaComodidadesQuarto();
    $modelPedidoReservaQuarto->quartoId = $idQuarto;

    if($modelPedidoReservaQuarto->save()){
        $modelPedidoReserva->nPessoas = 2;
        $modelPedidoReserva->preco = 70.00;
        $modelPedidoReserva->reservaQuartoId = $modelPedidoReservaQuarto->id;
        $modelPedidoReserva->userInfoId = Yii::$app->user->id;

        if($modelPedidoReserva->save()){
            $model->pedidoReservaId = $modelPedidoReserva->id;

            if ($model->load(Yii::$app->request->post()) && $model->save()) {
                return $this->redirect(['efetuar-pedido-reserva', 'idQuarto' => $idQuarto]);
            }

            return $this->render('../comodidades-extra/create', [
                'model' => $model, 'modelLista' => $modelListaComodidades
            ]);
        }
    }
}

当我刷新页面时,它会添加最后插入的 pedidoreservaid + 1;我想知道我这样做是否正确。

标签: phpdatabaseyii2

解决方案


您的问题是ComodidadesExtra每次调用$model = new ComodidadesExtra();. Yii2 将其视为新的独立行,您需要告诉 Yii2 您应该取而代之的是现有行,使用:

$model = ComodidadesExtra::find()
    ->where(['pedidoReservaId' => $modelPedidoReserva->id])
    ->one();

您的控制器应如下所示:

if($modelPedidoReserva->save()){
            if(null===($model = ComodidadesExtra::find()->where(['pedidoReservaId' => $modelPedidoReserva->id])
    ->one())) { 
                $model = new ComodidadesExtra(); 
            }
            $model->pedidoReservaId = $modelPedidoReserva->id;

            if ($model->load(Yii::$app->request->post()) && $model->save()) {
                return $this->redirect(['efetuar-pedido-reserva', 'idQuarto' => $idQuarto]);
            }

            return $this->render('../comodidades-extra/create', [
                'model' => $model, 'modelLista' => $modelListaComodidades
            ]);
        }

推荐阅读