令人惊讶的是,关于这一点的信息很少,我想我以前从未碰到过它,但我的情况是我有一个belongsTo
关系的模型。模型是关键,当我删除记录时,我需要确保它的关联记录也被删除。
具体来说,我有一个Building
模型,belongsTo
和Address
。当我删除建筑物时,我需要确保相关地址也被删除。
当然,我不能将关联标记为依赖关系,因此回调是确保地址记录被删除或有更好方法的最佳方法吗?这是其中一个我知道我可以用回调来做的情况,但在内脏层面,似乎应该有更好的方法。我想知道是不是这样。
感谢。
答案 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());
}