2017-03-03 68 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