CakePHP无法通过级联或beforeDelete()删除关联

时间:2015-01-28 19:07:18

标签: php cakephp cakephp-2.0

我在CakePHP 2.6上

我想删除几个依赖模型......

Users             hasMany ConversationsUser (join model)
ConversationsUser belongsTo User
                  belongsTo Conversation
Conversation      hasMany ConversationsUser

所有关系均为dependent => TRUE

当我删除用户时,我希望删除所有ConversationsUser以及所有对话。

目前,只有ConversationsUser被删除。对话仍然存在。

理论:也许级联不会在多个关系中递归地工作......

所以我将它添加到ConversationsUser模型

public function beforeDelete ( $cascade = true ) {
    $this->log( $this->conversation_id );
    $this->log( $this->ID );

    #delete all conversations
    $this->Conversation->delete( $this->conversation_id );

    return TRUE;
}

这个STILL不起作用......并且这两个属性都没有出现在日志中,虽然时间戳已经开始(所以我知道回调正在运行)。

  1. 为什么beforeDelete()
  2. 中未定义这些属性
  3. 为什么我的级联删除工作没有。
  4. 注意:如果相关,我的所有模型都使用可包含的行为

    更新 由于我似乎对我要做的事情感到困惑,我将提供一些背景信息。该应用程序允许两个不同的用户进行"对话"其中有很多消息。用户在会话中的成员资格由与ConversationsUser(连接表)模型的hasMany关系定义。如果管理员删除了对话中的一个用户,则需要删除所有该用户的消息,对话和对话用户... 以及对话用户已删除的对话中的其他参与者。否则那些其他用户就会在没有人的情况下进行对话,事情会中断。

1 个答案:

答案 0 :(得分:1)

这是一个不完整的答案 - 我现在无法编写和测试实际代码。

在您的用户模型中,添加beforeDelete回调。这个回调需要

  1. 获取该用户的所有对话列表(例如$this->ConversationsUser->findAllByUserId($this->id, array('conversation_id'))
  2. 遍历上一步中的conversation_id数组并删除每一个(确保Cascade = True)(例如$this->ConversationUser->Conversation->delete($conversation_id,true);
  3. 返回True,因此删除了用户记录
  4. 您在ConversationUser模型中不需要beforeDelete。

    这有效:

    public function beforeDelete( $cascade = TRUE ) {
    
        #delete all conversations
        $conversationIns = $this->ConversationIn->find('all', array('conditions'=>array('ConversationIn.user_id'=>$this->id)));
    
        foreach ($conversationIns as $conversationIn ) {
            $delete = $this->ConversationIn->Conversation->delete( $conversationIn['ConversationIn']['conversation_id'] );
        }
    
        return TRUE;
    }