我有两个表:步骤和链接加入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完全没有执行任何操作。它看起来像链接集合中缺少的成员不会触发脏标志或类似的东西。或许我正在以这种错误的方式去做,我希望有人能提供一些建议。
感谢
我不;没有看到任何调用来删除代码中的任何代码。我只看到你使用clear()。 clear()清除你应用到集合的任何标准/过滤器,它实际上不会删除任何东西。 – chocochaos
$ links var是ObjectCollection的一个实例,clear函数从集合中删除链接(根据API文档),打破了步骤和链接之间的关系,至少这是我的推理:)。通过打破这种关系,我希望Propel能够为缺失的链接对象触发一个隐式删除,就像触发一个添加到集合中的链接的插入一样。如果我要使用显式删除调用,我需要开始比较发布到后端的步骤和数据库中的链接,我希望能够阻止这些链接。感谢您的输入! – Remco