我有一个(程序)到很多(工具)关系设置。有时我想删除与过程相关的所有工具:
class Procedure extends BaseProcedure
{
...
function deleteTools()
{
$aProcedure = $this;
$someCondition = true;
foreach( $aProcedure->getTools() as $tool )
{
if($someCondition) {
$tool->delete();
}
}
$aProcedure->save(); // Right Here!
}
}
class ProcedureActions extends sfActions
{
...
public function executeTest(sfWebRequest $request)
{
$this->procedure = $this->getRoute()->getObject();
$this->procedure->deleteTools();
$this->action = "show";
$this->setTemplate("show", "procedure");
}
}
在这一行,我收到以下错误消息:
“SQLSTATE [23000]:完整性约束违规:1048列'procedure_id'不能为空”。四处寻找我看到这个sql语句正在准备中。
执行:INSERT INTO procedure_tools(id,procedure_id,tool_id, status_id,itemcount,comment)VALUES(?,?,?,?,?,?) - (,,,,, )
在我看来,相关程序还没有意识到删除。我无法弄清楚如何解决这个问题。删除 正在运行。第二次刷新,一切都是正确的。感谢任何帮助,谢谢。
(1)编辑以澄清更准确地代表我的情景。抱歉不首先这样做。
(2)编辑以显示整个函数的上下文。那里会有更多的逻辑(特别是评估$ someCondition,但目前这总是评估为true)。如果我以错误的方式召唤对象,那么启动动作的内容也会显示出来。
(3)编辑添加来自showSuccess模板的代码。
<?php foreach($procedure->getTools() as $tool): ?>
<tr>
<td><?php echo $tool->getId() ?></td>
<td><?php echo $tool->getStatus() ?></td>
<td><?php echo $tool->getName() ?></td>
</tr>
<?php endforeach; ?>
答案 0 :(得分:1)
foreach
循环不是必需的,可能是您遇到麻烦的原因。
$aProcedure->Tools->delete();
完成。
答案 1 :(得分:1)
为什么不在之后执行所有删除操作?这样,您只需执行一个查询即可删除许多工具。
$toolsToDelete = array();
foreach( $aProcedure->getTools() as $tool )
{
if($someCondition) {
$toolToDelete[] = $tool->getId();
}
}
$aProcedure->save(); // Right Here!
Doctrine_Query::create()
->delete('Tools t')
->whereIn('t.id', $toolsToDelete)
->execute();
修改强>
模板中发生的事情是Doctrine已经获取关系Tools
,因此它以某种方式缓存。这就是为什么在你的模板中,你仍然有删除的工具,并且在页面重新加载时没有它们。
我不记得我过去是如何设法做到这一点的,但你可以尝试refresh
对象及其关系。所以而不是:
$aProcedure->save(); // Right Here!
尝试:
$aProcedure->refresh(true);
ps:我假设你在$aProcedure
函数的deleteTools()
上没有执行任何其他操作。否则,您不应删除save()
。