在两个表之间移动整行

时间:2015-08-01 14:38:01

标签: php mysql yii2 yii2-advanced-app

我必须使用相同结构的表,client_data,new_client_data。 现在我想将一行从一个表移到另一个表。我找到了一种方法,它工作正常,但我想知道是否有更优雅和干净的方法来做它。

new_client_data / controller:

public function actionPromotion($id)
+    {
+        $model = $this->findModel($id);
+        
+        $clientData = new ClientData; 
+        $newClientNumber = $clientData->setNewClientNumber();
+        
+        $clientContacts = new OClientContacts;
+        
+        
+        if ($model->load(Yii::$app->request->post())) {
+            if($this->moveToClients(Yii::$app->request->post(), $model->id) & $clientContacts->moveContacts($id)){
+                return $this->redirect(['index']);
+            } else {
+                return $this->render('promprep', [
+                'model' => $model,
+                'newClientNumber' => $newClientNumber,
+            ]);
+            }           
+        } else {
+            return $this->render('promprep', [
+                'model' => $model,
+                'newClientNumber' => $newClientNumber,
+            ]);
+        }
+    }

它是从标准actionUpdate构建的基本控制器方法。 如果用户将正确提交所有发布数据,则函数将所有发布数据传递给该控制器中的另一个方法。 (我也想知道是否不应该放在模特中)。

+    public function moveToClients($post, $id){
+        $ClientData = new ClientData;
+        
+        $ClientData->name = $post['OClientData']['name'];
+        $ClientData->clientNumber = $post['OClientData']['clientNumber'];
+        $ClientData->abr= $post['OClientData']['abr'];
+        $ClientData->adress = $post['OClientData']['adress'];
+        $ClientData->city = $post['OClientData']['city'];
+        $ClientData->postal = $post['OClientData']['postal'];
+        $ClientData->phone = $post['OClientData']['phone'];
+        $ClientData->fax = $post['OClientData']['fax'];
+        $ClientData->email = $post['OClientData']['email'];
+        $ClientData->nip = $post['OClientData']['nip'];
+        $ClientData->krs = $post['OClientData']['krs'];
+        $ClientData->regon = $post['OClientData']['regon'];
+        $ClientData->www = $post['OClientData']['www'];
+        $ClientData->description = $post['OClientData']['description'];
+        $ClientData->isNewRecord = true;
+        $ClientData->id = null;
+        
+        if($ClientData->save()){
+           $this->actionDelete($id);
+            return true;
+        }
+       return false;
+
+    }

我的问题是:“有没有办法以更优雅的方式做到这一点?”

编辑。问题:“这个moveToClients方法应该落在控制器中吗?”;

1 个答案:

答案 0 :(得分:3)

有一种更优雅的方式。我相信你不应该为同一个概念设置两个单独的表。相反,您已经有一个client_data表,您应该添加一个新标志,即is_new。默认情况下,将其设置为1(true)。每当您需要将客户端修改为客户端时,只需将is_new标志更改为0(false)。