删除belongsTo Association

时间:2011-07-22 13:06:54

标签: cakephp cakephp-1.3

令人惊讶的是,关于这一点的信息很少,我想我以前从未碰到过它,但我的情况是我有一个belongsTo关系的模型。模型是关键,当我删除记录时,我需要确保它的关联记录也被删除。

具体来说,我有一个Building模型,belongsToAddress。当我删除建筑物时,我需要确保相关地址也被删除。

当然,我不能将关联标记为依赖关系,因此回调是确保地址记录被删除或有更好方法的最佳方法吗?这是其中一个我知道我可以用回调来做的情况,但在内脏层面,似乎应该有更好的方法。我想知道是不是这样。

感谢。

2 个答案:

答案 0 :(得分:1)

为什么不在数据库中使用外键并选择on DELETE CASCADE并让数据库完成工作......

[基于评论] 如果您将地址附加到您不想删除的其他模型,则可以将这些FK设置为​​ON DELETE RESTRICT,并且不会删除该建筑物。

如果您需要更复杂的东西,可以在模型中添加beforeDelete()回调,这里有一个example in the doc

祝你好运

答案 1 :(得分:1)

在cakephp 3.x中,你可以使用如下所述的unlink方法:

http://api.cakephp.org/3.3/class-Cake.ORM.Association.HasMany.html#_unlink

这会将数据库中的外键字段设置为null

在你的情况下,每当你想要删除建筑物中的记录时,它应该是这样的,所以将它集成到你的删除功能中。当然,它需要在模型中正确关联。

$address = $this->Addresses->get('address_id'):
$building = $this->Buildings->find()->where(['building_id' => 'some_id'])->toArray();

if ($this->Addresses->association('Buildings')->unlink($address, $building)) { 
    $this->Flash->success(__('Success!'));
    return $this->redirect($this->referer());
} else {
    $this->Flash->error(__('Error.'));
    return $this->redirect($this->referer());
}