PHP/prope删除记录1:n
我有两个表:步骤和链接1:n。我的目标是通过step对象维护链接。我从数据库中检索所有步骤,并用links表填充关系。我持久化包含JSON链接集合的step对象,并使用REST将其返回前端 这意味着,如果一个步骤链接或取消链接到前端的另一个步骤,我会将整个步骤发送回后端,包括一组链接。在后端,我使用以下代码:PHP/prope删除记录1:n,php,mysql,orm,propel,propel2,Php,Mysql,Orm,Propel,Propel2,我有两个表:步骤和链接1:n。我的目标是通过step对象维护链接。我从数据库中检索所有步骤,并用links表填充关系。我持久化包含JSON链接集合的step对象,并使用REST将其返回前端 这意味着,如果一个步骤链接或取消链接到前端的另一个步骤,我会将整个步骤发送回后端,包括一组链接。在后端,我使用以下代码: public function put($processStep) { if (isset($processStep['Processesid']) &&
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);
}
}
我基本上是从一个步骤中删除每个链接,然后根据请求对象重新创建链接。这节省了我比较删除和添加哪些链接的工作量。插入工作就像一个魅力推进自动创建新的链接。问题是它不像插入那样删除。我已经检查了被持久化的对象$p,我看到链接被删除了,但是在MySQL日志中,Prope绝对没有执行任何操作。看起来链接集合中缺少的成员不会触发脏标志或类似的东西
也许我走错了方向,我希望有人能提供一些建议
感谢要删除记录,您必须始终使用delete。当确定哪些实体需要添加、更新和删除时,集合上的diff方法非常有用。由于Ben我走上了正确的轨道,因此不需要显式地调用delete。我遇到了一个名为:setRelatedByObjectCollection的函数。我使用该函数提供相关对象的列表,新对象被解释为插入,遗漏被解释为删除 我没有找到任何关于该问题的相关文档,因此以下是我的代码:
$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();
我不知道;在代码中看不到任何删除anywe的调用。我只看到你在用透明的。clear清除应用于集合的任何条件/筛选器,它实际上不会删除任何内容。$links变量是ObjectCollection的实例,clear函数根据API文档从集合中删除链接,打破步骤与其链接之间的关系,至少这是我的推理:。通过打破这种关系,我希望spreep能够触发对缺失链接对象的隐式删除,就像它触发对添加到集合中的链接的插入一样。如果我要使用显式删除调用,我需要开始比较从发布到后端的步骤到数据库中我希望阻止的步骤的链接。谢谢你的意见!谢谢你,本,我只想知道这些。遗憾的是,我希望它能够像插入一样处理删除