【发布时间】:2017-03-03 13:49:03
【问题描述】:
我有两个表:step 和 links 以 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 绝对没有执行任何操作。看起来链接集合中缺少的成员不会触发脏标志或类似的东西。
也许我的方法不对,希望有人能提供一些建议。
谢谢
【问题讨论】:
-
我不知道;在代码中的任何地方都看不到对 delete() 的任何调用。我只看到你使用 clear()。 clear() 清除您应用于集合的任何条件/过滤器,它实际上不会删除任何内容。
-
$links var 是 ObjectCollection 的一个实例,clear 函数从集合中删除链接(根据 API 文档),破坏了步骤与其链接之间的关系,至少那是我的推理:)。通过打破这种关系,我希望 Propel 会触发丢失链接对象的隐式删除,就像它触发添加到集合中的链接的插入一样。如果我要使用显式删除调用,我需要开始比较发布到后端的步骤中的链接和我希望阻止的数据库中的链接。感谢您的意见!
标签: php mysql orm propel propel2