afterDelete()中的条件关联记录删除

时间:2014-11-21 20:46:22

标签: cakephp cakephp-2.0

我有以下设置:

型号:

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()之前调用了回调,这意味着任务在点击TasksTeam afterDelete()时尚未被删除

问题

如果任务未被删除,如何才能成功保存Change

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果在实际删除之前调用了回调,我会看到维护一个assoc。任务ID作为键的标志数组或一组任务ID,在afterDelete上调用Task时添加。然后,您可以在Task中创建一个方法,例如isDeleting或类似的查询数组的方法,告诉您该任务是否正在被删除。

答案 1 :(得分:0)

使用@James Dunne的建议我最终在名为Task的{​​{1}}模型中添加了一个tinyint字段,只需在is_deleted Task中设置此布尔值为true。然后,我检查此标志,如果标志为布尔值false,则仅保存beforeDelete()。为记录被删除之前仅受影响的内容添加字段似乎很浪费,但为了我的目的,它可以正常工作。我认为这是一个真正的解决方案"将涉及Cake Events System,避免需要链式回调。