CakePHP 无法通过级联或 beforeDelete() 删除关联
CakePHP unable to delete associations by cascade or beforeDelete()
我正在使用 CakePHP 2.6
我要删除几个依赖模型...
Users hasMany ConversationsUser (join model)
ConversationsUser belongsTo User
belongsTo Conversation
Conversation hasMany ConversationsUser
所有关系都是dependent => TRUE
当我删除用户时,我希望删除所有 ConversationsUser 以及所有 Conversations。
目前,只有 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;
}
这仍然不起作用...属性 也没有出现在日志中,尽管时间戳确实存在(所以我知道回调是 运行)。
- 为什么那些属性没有在
beforeDelete()
中定义
- 为什么我的级联删除不起作用。
注意:如果相关,我的所有模型都使用可容纳行为
更新:
由于似乎对我正在尝试做的事情有些困惑,我将提供一些背景信息。该应用程序允许两个不同的用户进行 "Conversation" 其中有许多消息。用户在对话中的成员资格由与 ConversationsUser (join table) 模型的 hasMany 关系定义。如果管理员删除了对话中的一个用户,则需要删除该用户的所有消息、对话和 ConversationsUser...以及 [的 ConversationsUser =35=]其他 位已删除对话的参与者。否则,那些其他用户将无法与任何人进行对话,事情就会中断。
这是一个不完整的答案 - 我现在无法编写和测试实际代码。
在您的用户模型中,添加一个 beforeDelete 回调。此回调需要
- 获取该用户所有对话的列表(例如,
$this->ConversationsUser->findAllByUserId($this->id, array('conversation_id'))
)
- 遍历上一步的 conversation_id 数组并删除每一个(确保 Cascade=True)(例如,
$this->ConversationUser->Conversation->delete($conversation_id,true);
- Return 是的,所以删除了用户记录
您不需要在 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;
}
我正在使用 CakePHP 2.6
我要删除几个依赖模型...
Users hasMany ConversationsUser (join model)
ConversationsUser belongsTo User
belongsTo Conversation
Conversation hasMany ConversationsUser
所有关系都是dependent => TRUE
当我删除用户时,我希望删除所有 ConversationsUser 以及所有 Conversations。
目前,只有 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;
}
这仍然不起作用...属性 也没有出现在日志中,尽管时间戳确实存在(所以我知道回调是 运行)。
- 为什么那些属性没有在
beforeDelete()
中定义
- 为什么我的级联删除不起作用。
注意:如果相关,我的所有模型都使用可容纳行为
更新: 由于似乎对我正在尝试做的事情有些困惑,我将提供一些背景信息。该应用程序允许两个不同的用户进行 "Conversation" 其中有许多消息。用户在对话中的成员资格由与 ConversationsUser (join table) 模型的 hasMany 关系定义。如果管理员删除了对话中的一个用户,则需要删除该用户的所有消息、对话和 ConversationsUser...以及 [的 ConversationsUser =35=]其他 位已删除对话的参与者。否则,那些其他用户将无法与任何人进行对话,事情就会中断。
这是一个不完整的答案 - 我现在无法编写和测试实际代码。
在您的用户模型中,添加一个 beforeDelete 回调。此回调需要
- 获取该用户所有对话的列表(例如,
$this->ConversationsUser->findAllByUserId($this->id, array('conversation_id'))
) - 遍历上一步的 conversation_id 数组并删除每一个(确保 Cascade=True)(例如,
$this->ConversationUser->Conversation->delete($conversation_id,true);
- Return 是的,所以删除了用户记录
您不需要在 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;
}