0

私は1つ(手順)から多くの(ツール)の関係を設定しています。手順に関連するすべてのツールを削除したい場合があります。

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'をnullにすることはできません」。掘り下げてみると、このSQLステートメントが準備されていることがわかります。

実行:INSERT INTO procedure_tools(id、procedure_id、tool_id、status_id、itemcount、comment)VALUES(?、?、?、?、?、?)-(、、、、、、)

関連するプロシージャはまだ削除を認識していないように見えます。しかし、これを回避する方法がわかりません。削除機能しています。2回目の更新で、すべてが正しいです。どんな助けでもありがたいです、ありがとう。

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

2 に答える 2

1

ループは必要なく、foreachトラブルの原因となる可能性があります。

$aProcedure->Tools->delete();

終わり。

于 2012-07-26T22:26:23.777 に答える
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);

$aProcedureps:関数内で他に何も実行しないと仮定しますdeleteTools()。それ以外の場合は、を削除しないでくださいsave()

于 2012-07-27T07:50:07.323 に答える