2014-11-21 92 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或查询该数组的相似方法,告诉您该任务是否正在被删除。