2016-08-23 59 views
0

一個請求一些快速上下文: 我有一個SQL表和JobCards一個雄辯的模型,每個JobCard有幾個操作屬於它。我有一個表格和模型操作。我的應用程序瀏覽的用戶和編輯JobCards,但是當我說編輯Jobcard這可以包括編輯操作JobCard相關。我有一個頁面,用戶可以編輯Operations對於某個JobCard,我提交數據作爲操作的數組。更新幾條記錄與laravel

我希望有一個乾淨的方式來更新操作的JobCard數據。還有我可能會或可能不會需要做3個不同的動作:

  1. 更新現有操作用新的數據
  2. 創建一個新的操作
  3. 刪除Operatation

我試着處理前2個,事情已經變得凌亂了。如果在請求中發送的數組中不存在,我仍然需要一種刪除操作的方法。

繼承人我的代碼:

public function SaveOps(Request $a) 
{ 
    $JobCardNum = $a -> get('JobCardNum'); 
    $Ops = $a -> get('Ops'); 

    foreach ($Ops as $Op) { 

     $ExistingOp = JobCardOp::GetOp($JobCardNum, $Op['OpNum'])->first(); 
     if(count($ExistingOp)==0) { 
      $NewOp = new JobCardOp; 
      $NewOp -> JobCardNum = $JobCardNum; 
      $NewOp -> fill($Op); 
      $NewOp -> save(); 
      $this->UpdateNextOpStatus($JobCardNum, $NewOp); 
     } 
     else { 
      $ExistingOp -> fill($Op); 
      $ExistingOp -> save(); 

     }    
    } 

誰能幫助與刪除部分和/或幫助使我的代碼更整潔。

回答

1

這就是你的方法應該如何。請注意,我添加了一個新方法getCache($JobCardNum)此方法將獲得每個作業卡的一系列操作(假設您的模型設計爲以此方式關聯),此方法將僅轉到數據庫一次,以獲取所有操作您需要使用此method call而不是逐一獲取它們(在foreach循環中),這樣您就可以確保對數據庫的昂貴呼叫只進行一次,另一方面您可以在表單中獲得JobCard的操作的數組準備與新數據進行比較(來自請求),則此方法的返回將採用(key=>value,其中key是操作數,而value是它自己的操作對象)。

/** 
* This function will get you an array of current operations in the given job card 
* @param $JobCardNum 
* @return array 
*/ 
public function getCache($JobCardNum) 
{ 
    /** 
    * asuming that the relation in your model is built that way. if not you should then 
    * use JobCardOp::all(); (Not recommended because it will get a lot of unnecessary 
    * data) 
    */ 
    $ExistingOps = JobCardOp::where('job_card_id', '=', $JobCardNum); 

    $opCache = array(); 
    foreach ($ExistingOps as $Op) { 
     $opCache[(string)$Op->OpNum] = $Op; 
    } 
    return $opCache; 
} 

public function SaveOps(Request $a) 
{ 
    $strOpNum = (string)$Op['OpNum']; 
    $JobCardNum = $a->get('JobCardNum'); 
    $Ops = $a->get('Ops'); 
    $opCache = $this->getCache($JobCardNum); 
    foreach ($Ops as $Op) { 
     if (!isset($opCache[$strOpNum])) { 
      $NewOp = new JobCardOp; 
      $NewOp->JobCardNum = $JobCardNum; 
      $NewOp->fill($Op); 
      $NewOp->save(); 
      $this->UpdateNextOpStatus($JobCardNum, $NewOp); 
     } else { 
      $ExistingOp = $opCache[$strOpNum]; 
      $ExistingOp->fill($Op); 
      $ExistingOp->save(); 
     } 
     unset($opCache[$strOpNum]); 
    } 

    /* 
    * at this point any item in the $opCache array must be deleted because it was not 
    * matched in the previous for loop that looped through the requested operations :) 
    */ 
    foreach ($opCache as $op) { 
     $op->delete(); 
    } 
} 
+0

謝謝,你能解釋一下這對性能有什麼幫助嗎? –

+0

歡迎您:)我編輯答案請檢查 –