0

我有两个表:步骤和链接加入 1:n。我的目标是通过步骤对象维护链接。我从数据库中检索所有步骤并使用链接表填充关系。我保留包含指向 JSON 的链接集合的 step 对象,并使用 REST 将其返回到前端。

这意味着,如果一个步骤与前端的另一个步骤链接或取消链接,我会将整个步骤发送回后端,包括一组链接。在后端,我使用以下代码:

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 绝对没有执行任何操作。看起来链接集合中缺少的成员不会触发脏标志或类似的东西。

也许我的方法是错误的,我希望有人能提供一些建议。

谢谢

4

2 回答 2

1

要删除记录,您绝对必须始终使用delete. diff在确定需要添加、更新和删除哪些实体时,集合上的方法非常有用。

于 2017-03-05T04:13:31.620 回答
0

感谢 Ben,我走上了正确的道路,不需要明确调用删除。我遇到了一个名为: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();
于 2017-03-05T15:21:53.527 回答