2011-07-22 10 views
1

これについて驚くほどの情報はありません。以前はこれまでに実行したことはありませんが、私はbelongsToという関係のモデルを持っています。モデルがキーです。レコードを削除するときには、関連するレコードも削除されていることを確認する必要があります。belongsToアソシエーションを削除する

具体的には、belongsToAddressBuildingモデルがあります。建物を削除すると、関連する住所も削除されていることを確認する必要があります。

私は依存関係としてフラグを立てることはできません。そのため、コールバックはアドレスレコードが確実に削除されるかどうかを確認する最良の方法ですか?これは、私がコールバックでそれを行うことができることを知っているそれらのケースの1つですが、内臓レベルでは、より良い方法があるはずです。私はそれが事実かどうか疑問に思います。

ありがとうございました。 [コメントをもと]

データベースに外部キーを使用していない理由を
+0

ビルディングとアドレスにhasOne/belongsToの関連付けがある場合、そのアドレスをBuildingテーブルに保存しないでください。 – Dave

+0

いくつかの異なるモデル(Building、Contractor、Companyなど)には住所の値があり、それらのフィールドを統合したいと考えました。 –

+0

データベースで外部キーを使用せず、 'DELETE CASCADEで'を選択する理由 – pleasedontbelong

答えて

1

on DELETE CASCADEを選択し、データベースには仕事をさせ...

ご住所は、あなたが望むいけない他のモデルに添付されている場合削除するには、それらのFKをON DELETE RESTRICTに設定して建物を削除しないでください。あなたがあなたのモデルにbeforeDelete()コールバックを追加することができ、より複雑な何かが必要な場合は

はそして、あなたはここで説明したようにリンク解除の方法を使用することができ、CakePHPの3.xのではexample in the doc

グッドラック

+0

私は 'addresses'テーブルを多面的にすることになりました。なぜなら、それはもっと正確で/私のニーズにも(現在' Building hasOne Address'など)適用されているからです。 –

1

があります:

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

これは

をゼロにするために、データベース内の外部キーフィールドを設定します0

あなたの場合は、建物からレコードを削除して削除機能に統合したいときに毎回このようなものにする必要があります。もちろん、モデルには適切な関連付けが必要です。

$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

ありがとうコメントを削除しました –

関連する問題