2017-03-03 58 views
0

我有兩個表:步驟和鏈接加入1:n。我旨在維護通過步驟對象的鏈接。我檢索數據庫中的所有步驟並填充與鏈接表的關係。我堅持包含JSON鏈接集合的步驟對象,並使用REST將其返回到前端。PHP /推進刪除記錄1:n

這意味着如果某個步驟與前端的另一個步驟鏈接或取消鏈接,則會將整個步驟發送回包含鏈接集合的後端。在後端我使用下面的代碼:

public function put($processStep) { 
     if (isset($processStep['Processesid']) && isset($processStep['Coordx']) && isset($processStep['Coordy'])) { 
      $p = $this->query->findPK($processStep['Id']); 

      $p->setId($processStep['Id']); 
      $p->setProcessesid($processStep['Processesid']); 
      if (isset($processStep['Flowid'])) $p->setFlowid($processStep['Flowid']); 
      if (isset($processStep['Applicationid'])) $p->setApplicationid($processStep['Applicationid']); 
      $p->setCoordx($processStep['Coordx']); 
      $p->setCoordy($processStep['Coordy']); 

      $links = $p->getLinksRelatedByFromstep(); 
      $links->clear(); 

      foreach ($processStep['Links'] as $link) { 
       if (!isset($link['Linkid'])) { 
        $newLink = new \Link(); 

        $newLink->setFromstep($link['Fromstep']); 
        $newLink->setTostep($link['Tostep']); 

        $links->prepend($newLink); 
       } 
      } 

      $p->save(); 

      return $p; 
     } else { 
      throw new Exceptions\ProcessStepException("Missing mandatory fields.", 1); 
     } 
    } 

我基本上刪除某個步驟的每一個環節,並根據請求對象我重新鏈接。這爲我節省了比較哪些鏈接被刪除和添加的努力。插入工作就像一個魅力Propel自動創建新的鏈接。事情是它不會像插入一樣刪除。我檢查了正在被持久化的對象($ p),並且我看到鏈接被刪除,但在MySQL日誌中,Propel完全沒有執行任何操作。它看起來像鏈接集合中缺少的成員不會觸發髒標誌或類似的東西。或許我正在以這種錯誤的方式去做,我希望有人能提供一些建議。

感謝

+0

我不;沒有看到任何調用來刪除代碼中的任何代碼。我只看到你使用clear()。 clear()清除你應用到集合的任何標準/過濾器,它實際上不會刪除任何東西。 – chocochaos

+0

$ links var是ObjectCollection的一個實例,clear函數從集合中刪除鏈接(根據API文檔),打破了步驟和鏈接之間的關係,至少這是我的推理:)。通過打破這種關係,我希望Propel能夠爲缺失的鏈接對象觸發一個隱式刪除,就像觸發一個添加到集合中的鏈接的插入一樣。如果我要使用顯式刪除調用,我需要開始比較發佈到後端的步驟和數據庫中的鏈接,我希望能夠阻止這些鏈接。感謝您的輸入! – Remco

回答

0

感謝本我得到了正確的軌道,明確要求刪除不需要。我遇到了一個名爲setRelatedBy(ObjectCollection o)的函數:我使用這個函數來提供相關對象的列表,新對象被解釋爲插入,而忽略被解釋爲刪除。

我沒找到所以這裏關於該問題的任何相關文件是我的代碼:

$p = $this->query->findPK($processStep['Id']); 

      $p->setId($processStep['Id']); 
      $p->setProcessesid($processStep['Processesid']); 
      $p->setCoordx($processStep['Coordx']); 
      $p->setCoordy($processStep['Coordy']); 
      if (isset($processStep['Flowid'])) $p->setFlowid($processStep['Flowid']); 
      if (isset($processStep['Applicationid'])) $p->setApplicationid($processStep['Applicationid']); 

      //Get related records, same as populaterelation 
      $currentLinks = $p->getLinksRelatedByFromstep(); 
      $links = new \Propel\Runtime\Collection\ObjectCollection(); 

      //Check for still existing links add to new collection if so. 
      //This is because creating a new Link instance and setting columns marks the object as dirty creating an exception due to duplicate keys 
      foreach ($currentLinks as $currentLink) { 
       foreach ($processStep['Links'] as $link) { 
        if (isset($link['Linkid']) && $currentLink->getLinkid() == $link['Linkid']) { 
         $links->prepend($currentLink); 

         break; 
        } 
       } 
      } 

      //Add new link objects 
      foreach ($processStep['Links'] as $link) { 
       if (!isset($link['Linkid'])) { 
        $newLink = new \Link(); 

        $newLink->setFromstep($link['Fromstep']); 
        $newLink->setTostep($link['Tostep']); 

        $links->prepend($newLink); 
       } 

      } 

      //Replace the collection and save the processstep. 
      $p->setLinksRelatedByFromstep($links); 
      $p->save(); 
1

要刪除的記錄,你絕對總是要使用delete。在確定需要添加,更新和刪除哪些實體時,集合上的diff方法非常有用。

+0

感謝本,這就是我需要知道的一切。可惜,儘管我希望能夠直觀地處理插入等刪除操作 – Remco