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;
}
这仍然不起作用...并且这两个属性都没有出现在日志中,尽管时间戳确实如此(所以我知道回调正在运行)。
- 为什么这些属性未在
beforeDelete()
中定义 - 为什么我的级联删除不起作用。
注意:如果相关,我的所有模型都使用可包含行为
更新:由于似乎对我想要做的事情有些困惑,我将提供一些背景信息。该应用程序允许两个不同的用户进行具有许多消息的"对话"。用户在会话中的成员身份由与对话用户(联接表)模型的 hasMany 关系定义。如果管理员删除了对话中的一个用户,则需要删除该用户的所有消息、对话和对话用户...以及已删除对话中其他参与者的对话用户。否则,那些其他用户将不与任何人进行对话,事情就会中断。
这是一个不完整的答案 - 我现在无法编写和测试实际代码。
在用户模型中,添加 beforeDelete 回调。 此回调需要
- 获取该用户的所有对话的列表(例如,
$this->ConversationsUser->findAllByUserId($this->id, array('conversation_id'))
) - 遍历上一步中的conversation_id数组并删除每个数组(确保具有 Cascade=True)(例如,
$this->ConversationUser->Conversation->delete($conversation_id,true);
- 返回 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;
}