在两个表之间移动整行

Moving whole row between two tables

我必须 table 具有相同结构,client_data,new_client_data。 现在我想将整行从 table 移动到另一行。我找到了一种方法,它工作正常,但我想知道是否有更优雅、更干净的方法来做到这一点。

new_client_data / 控制器:

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 构建的基本控制器方法。 如果用户将正确提交所有 post 数据,则函数会将所有 post 数据传递给该控制器中的另一个方法。 (我也想知道是否不应该放在模型中)。

+    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;
+
+    }

我的问题是:"Is there a way to do this in more elegant way?";

编辑。问题:"Should this moveToClients method land in the controller?";

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