Cakephp 删除belongsTo关联

Cakephp 删除belongsTo关联,cakephp,cakephp-1.3,Cakephp,Cakephp 1.3,令人惊讶的是,关于这一点的信息很少,我想我以前从未遇到过,但我的情况是,我有一个属于关系的模型。模型是关键,当我删除记录时,我需要确保其关联的记录也被删除 具体来说,我有一个建筑模型,属于地址。当我删除建筑时,我需要确保关联的地址也被删除 当然,我不能将关联标记为依赖,那么回调是确保删除地址记录的最佳方法还是有更好的方法?这是其中一个我知道我可以通过回调实现的例子,但从本质上看,似乎应该有更好的方法。我想知道情况是否如此 谢谢。为什么不在数据库中使用外键,然后在删除级联上选择,让数据库完成工作

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

具体来说,我有一个
建筑
模型,属于
地址
。当我删除建筑时,我需要确保关联的地址也被删除

当然,我不能将关联标记为依赖,那么回调是确保删除地址记录的最佳方法还是有更好的方法?这是其中一个我知道我可以通过回调实现的例子,但从本质上看,似乎应该有更好的方法。我想知道情况是否如此


谢谢。

为什么不在数据库中使用外键,然后在删除级联上选择
让数据库完成工作

[根据评论]如果您将地址附加到不想删除的其他型号,您可以在删除限制时将这些FK设置为
,并且建筑物不会被删除

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


祝您好运

在cakephp 3.x中,您可以使用如下所述的取消链接方法:

这会将数据库中的外键字段设置为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());
}

如果建筑物和地址有一个hasOne/belongsTo关联,为什么不将地址保留在建筑物表中?几个不同的模型(例如建筑物、承包商、公司)有地址值,我想合并这些字段。为什么不在数据库中使用外键并在删除级联上选择
?@请不要归属我想这有点麻烦。从地址中删除会让我有点害怕,因为它是辅助数据(我们“关心”的是建筑物),但同时,它非常重要,我希望它与建筑物一起删除。不过,这是个好主意。考虑到我的工作,这可能是最干净的解决方案。将其添加为答案,我会将其标记为答案。我最终使
地址
表具有多态性,因为这更准确/更适合我的需要(例如,现在
建筑只有一个地址
),但这将非常有效。请同时改进此答案。谢谢我删除了我的评论