0

我建立了一个(程序)对多(工具)的关系。有时我想删除与过程相关的所有工具:

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,但目前这总是评估为真)。还会显示启动动作的内容,以防我以错误的方式召唤对象。

(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; ?>
4

2 回答 2

1

foreach循环不是必需的,并且可能是您遇到麻烦的原因。

$aProcedure->Tools->delete();

完毕。

于 2012-07-26T22:26:23.777 回答
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:我假设您$aProceduredeleteTools()函数中没有执行任何其他操作。否则,您不应删除save().

于 2012-07-27T07:50:07.323 回答