2011-07-22 88 views
1

關於這個有驚人的信息很少被發現,我想我以前從未遇到過這種情況,但是我處於一種有belongsTo關係的模型。模型是關鍵,當我刪除一條記錄時,我需要確保它的關聯記錄也被刪除。刪除一個belongsTo協會

具體來說,我有一個Building模型belongsToAddress。當我刪除建築物時,我需要確保關聯的地址也被刪除。

我無法將關聯標記爲依賴關係,當然,回調是確保地址記錄被刪除或有更好方法的最佳方法嗎?這是其中一種情況,我知道我可以用回調做到這一點,但在內心層面上,似乎應該有更好的方法。我想知道是否是這種情況。

謝謝。

+0

如果Building和Address有一個hasOne/belongsTo關聯,爲什麼不把這個地址保存在Building表中? – Dave

+0

幾種不同的模型(例如建築,承包商,公司)具有地址值,我想合併這些字段。 –

+0

爲什麼不在數據庫中使用外鍵並選擇'DELETE CASCADE'? – pleasedontbelong

回答

1

爲什麼不使用數據庫中的外鍵和選擇on DELETE CASCADE,讓數據庫做的工作......

[基於註釋]如果你的地址連接到你不希望其他車型要刪除,您可以將這些FK設置爲​​ON DELETE RESTRICT,並且該建築物不會被刪除。

如果你需要更復雜的東西,你可以在模型中添加beforeDelete()回調,有一個example in the doc

好運

+0

我最終制作了'addresses'表多態,因爲無論如何這都更準確/適用於我的需求(例如'Building hasOne Address',例如),但這樣做會非常好。 –

1

在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()); 
} 
+0

請改善這個答案,因爲[你的答案在另一座城堡中:何時答案不是答案](http://meta.stackexchange.com/questions/225370)。 – Drew

+0

謝謝我刪除了我的評論 –