PHP/Propel 删除记录 1:n
PHP/Propel delete record 1:n
我有两个 table:步骤和 link 加入 1:n。我的目标是通过步骤对象维护 links。我从数据库中检索所有步骤并使用 links table 填充关系。我使用 REST 将包含 links 集合的步骤对象持久化到 JSON 并将其 return 持久化到前端。
这意味着如果一个步骤被 linked 或 unlinked 到前端的另一个步骤,我将整个步骤发送回后端,包括 [=26= 的集合]s。在后端我使用以下代码:
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);
}
}
我基本上是从一个步骤中删除每个 link,并根据请求对象重新创建 link。这让我省去了比较删除和添加的 link 的工作。插入工作就像一个魅力 Propel 自动创建新的 links。事情是它不会像插入那样删除。我已经检查了正在持久化的对象 ($p),我看到 link 被删除了,但是在 MySQL 日志中,Propel 绝对没有执行任何操作。看起来 link 集合中缺少的成员不会触发脏标志或类似的东西。
可能是我的思路不对,希望大家指点一下。
谢谢
要删除记录,您绝对必须始终使用 delete
。在确定需要添加、更新和删除哪些实体时,集合的 diff
方法非常有用。
感谢 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();
我有两个 table:步骤和 link 加入 1:n。我的目标是通过步骤对象维护 links。我从数据库中检索所有步骤并使用 links table 填充关系。我使用 REST 将包含 links 集合的步骤对象持久化到 JSON 并将其 return 持久化到前端。
这意味着如果一个步骤被 linked 或 unlinked 到前端的另一个步骤,我将整个步骤发送回后端,包括 [=26= 的集合]s。在后端我使用以下代码:
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);
}
}
我基本上是从一个步骤中删除每个 link,并根据请求对象重新创建 link。这让我省去了比较删除和添加的 link 的工作。插入工作就像一个魅力 Propel 自动创建新的 links。事情是它不会像插入那样删除。我已经检查了正在持久化的对象 ($p),我看到 link 被删除了,但是在 MySQL 日志中,Propel 绝对没有执行任何操作。看起来 link 集合中缺少的成员不会触发脏标志或类似的东西。
可能是我的思路不对,希望大家指点一下。
谢谢
要删除记录,您绝对必须始终使用 delete
。在确定需要添加、更新和删除哪些实体时,集合的 diff
方法非常有用。
感谢 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();