【问题标题】:Delete a belongsTo Association删除 belongsTo 关联
【发布时间】:2011-07-22 13:06:53
【问题描述】:

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

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

当然,我不能将关联标记为依赖,那么回调是确保地址记录被删除的最佳方法还是有更好的方法?这是我知道我可以通过回调来做到这一点的情况之一,但在本能层面上,似乎应该有更好的方法。我想知道是不是这样。

谢谢。

【问题讨论】:

  • 如果 Building 和 Address 有 hasOne/belongsTo 关联,为什么不将地址保留在 Building 表中?
  • 几个不同的模型(例如建筑、承包商、公司)具有地址值,我想合并这些字段。
  • 为什么不在数据库中使用外键并选择on DELETE CASCADE??
  • @pleasedontbelong 我想这有点像 catch-22。从地址中删除让我有点害怕,因为它是辅助数据(建筑物是我们“关心”的),但同时,它足够重要,我希望它与建筑物一起删除。不过,这是个好主意。鉴于我正在使用的内容,它可能是最干净的解决方案。将其添加为答案,我会将其标记为 the 答案。

标签: cakephp cakephp-1.3


【解决方案1】:

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

[根据评论]如果你的地址附加到其他不想删除的模型上,你可以将那些FK设置为​​ON DELETE RESTRICT,建筑物不会被删除。 p>

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

祝你好运

【讨论】:

  • 我最终使addresses 表多态,因为无论如何这更准确/更适用于我的需求(例如现在Building hasOne Address),但这会非常有效。跨度>
【解决方案2】:

在 cakephp 3.x 中,您可以使用此处描述的取消链接方法:

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

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

在您的情况下,每次您想从建筑物中删除记录时都应该是这样的,因此将其集成到您的删除功能中。当然,这需要模型中的正确关联。

$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());
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2018-07-13
相关资源
最近更新 更多