2014-11-21 107 views
1

我有以下設置:條件相關記錄刪除在afterDelete()

型號:

Team 
Task 
Change 
TasksTeam 

TasksTeam是hasManyThrough,該團隊的任務相關聯。 Change用於記錄任務細節的變化,包括團隊被連接/分離時(即通過TasksTeam中的記錄)。

TasksTeam也級聯刪除Task。如果任務被刪除,所有相關的團隊關聯也應該被刪除。

當一個TasksTeam被刪除,這意味着一個團隊已經離開了一個任務,我想爲此記錄一個Change。我正在使用TasksTeam afterDelete()來記錄隊伍離開。在TasksTeam beforeDelete我保存數據到$this->predelete,所以它將在afterDelete()可用。

這裏是TasksTeam非工作代碼:

public function afterDelete(){ 
    $team_id = $this->predelete['TasksTeam']['team_id']; 
    $task_role_id = $this->predelete['TasksTeam']['task_role_id']; 
    $task_id = $this->predelete['TasksTeam']['task_id']; 

    // Wanted: only record a change if the task isn't deleted 
    if($this->Task->exists($task_id)){ 
     $this->Task->Change->removeTeamFromTask($task_id, $team_id, $task_role_id);  
    }  
    return true; 
} 

問題:

當任務被刪除,刪除級聯到TasksTeam正確。但是,即使任務被刪除,也會記錄更改。從另一個答案在SO類似的東西,我想原因是,當它擊中回調Model:del()之前調用,這意味着任務尚未被刪除TasksTeamafterDelete()

問題

我怎樣才能只有在任務未被刪除的情況下才能成功保存Change

在此先感謝。

回答

0

使用來自@詹姆斯·鄧恩我最終加入TINYINT場到Task模型的建議稱爲is_deleted和簡單地設置這個布爾在TaskbeforeDelete()如此。然後我檢查這個標誌,如果標誌是boolean false,那麼只保存Change。添加一個字段的東西只是在記錄被刪除之前受到影響似乎很浪費,但對於我的目的來說它工作正常。我認爲一個「真正的解決方案」將涉及Cake Events System,避免了鏈接回調的需要。

1

如果在實際刪除之前調用回調被調用,我會看到維護一個assoc。將任務ID作爲關鍵字的標誌數組或在Task上調用afterDelete時添加的一組任務標識。然後,您可以在Task中創建一個方法,如isDeleting或查詢該數組的相似方法,告訴您該任務是否正在被刪除。