CakePHP の BelongsToMany でdependent は default が true になっている #CakePHP

アソシエーションの dependant

CakePHP のモデルのアソシエーションには dependant というキーが用意されており、 true に設定することで削除のときに関連付けたモデルのレコードもまとめて削除することができる。

book.cakephp.org

belongsToMany だけデフォルト true

ところが hasOne など他のアソシエーションはデフォルトが false になっているが、 belongsToMany はデフォルトが true になっている。

なので、明示的に設定しなくても関連したモデルのレコードが消されてしまう。

意図しない削除を避けたり他のアソシエーションと一貫性をもたせるたりするためにも、デフォルトは false の方がいいと思って違和感がある。

互換性が理由だった

そこで Cake の実装を見てみると、互換性のために true にしているとコメントがしてあった。

cakephp/BelongsToMany.php at 4.4.6 · cakephp/cakephp · GitHub

過去の PR や Issue を追っかけてみたところ、どうやら関連レコードをどうやっても消してしまうという問題があったようだ。

消さないようにする修正を入れたものの、消すほうが現行の挙動だから、互換性のために default を true にしているというのが経緯らしい。

修正自体はかなり前なので、 CakePHP を長く触っている人なら常識なのかもしれない。

github.com