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


CakePHP unable to delete associations by cascade or beforeDelete()

I'm on CakePHP 2.6

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

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

所有关系都是dependent => TRUE

删除用户

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

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

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

所以我把它添加到对话用户模型中

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;
}

这仍然不起作用...并且这两个属性都没有出现在日志中,尽管时间戳确实如此(所以我知道回调正在运行)。

  1. 为什么这些属性未在beforeDelete()中定义
  2. 为什么我的级联删除不起作用。

注意:如果相关,我的所有模型都使用可包含行为

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

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

在用户模型中,添加 beforeDelete 回调。 此回调需要

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

在对话用户模型中不需要 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;
}