2012-07-26 58 views
0

我有一個(過程)到很多(工具)關係的設置。有時候我想刪除與過程相關聯的所有工具:object-> delete()在相關對象上不會立即持久

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,評論)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; ?> 

回答

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(); 

編輯:

什麼在你的模板happend,是學說已獲取的關係Tools,所以它在某種程度上緩存。這就是爲什麼在你的模板中,你仍然有刪除的工具,並沒有他們在頁面重新加載。

我不記得過去我是如何設法做到這一點的,但您可以嘗試refresh這個對象及其關係。因此,而不是:

$aProcedure->save(); // Right Here! 

嘗試:

$aProcedure->refresh(true); 

PS:我認爲你沒有執行對$aProcedure別人在你的deleteTools()功能。否則,你不應該刪除save()

+0

這是個好主意,謝謝。我真的專注於弄清楚爲什麼我得到錯誤,我沒有考慮替代方案。我剛剛實施了這個建議,並引入了一個新問題。刪除項目後,操作將重定向到「顯示」視圖。該視圖不會被刪除更新。如果我刷新然後我看到他們,但最初的觀點是沒有得到消息。也許我需要保存工具表...? – Charles 2012-07-27 13:22:27

+0

在'foreach'(主要涉及到'$ aProcedure')之前更新你的問題,你在'show'視圖中顯示什麼。 – j0k 2012-07-27 13:29:19

+0

我已經更新了我的答案。 – j0k 2012-07-27 14:34:07

1

foreach循環是沒有必要的,而且很可能你的煩惱的原因。

$aProcedure->Tools->delete(); 

完成。

+0

不幸的是我意識到我過於簡單。我實際上並不想刪除它們 - 我可以按照您的建議使用doctrine_collection中的刪除。我實際上想要根據標準刪除某些項目。 – Charles 2012-07-27 00:08:22