みなさんこんにちは!
リレーションを組んでリレーション先も同時に消す方法を勘違いしていたので自分の戒めのためにメモとして残しておきます。
データを消すときはdeleteメソッドを使ってcascadeをtrueにすればリレーション先も消してくれると思っていました。 ただドキュメントよく見ると、この値、defaultではtrueなんですよね・・・
これではうまく消えない・・・ではどうすればいいのかというとリレーションを組んでいる部分でdependentオプションをtrueにしておかなければならないのです(´・ω・`) つまり2箇所をしっかりtrueにしておけばリレーション先もうまく消えてくれる、ということです。
これだけではブログ記事としてはなんだかなぁなので一応確認しておきます。
データベース、コードの確認
CakePHPは前まとめたもので作ってあることを前提とします。 試してみたい方は以下の記事でプロジェクトを作る部分までやっておいてください。
CakePHP2をComposerでインストールしてプロジェクトを立ち上げるまで
そしてデータベースは以下のようなものを準備します。適当なので気にしないでください。
CREATE TABLE IF NOT EXISTS `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ); CREATE TABLE IF NOT EXISTS `items` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ); INSERT INTO `users` (`id`, `name`, `created`, `modified`) VALUES (1, 'test1', NOW(), NOW()); INSERT INTO `items` (`id`, `user_id`, `name`, `created`, `modified`) VALUES (1, 1, 'test2', NOW(), NOW());
User.phpはこんな感じ
Model/User.php
[ 'className' => 'Item', 'foreignKey' => 'user_id', 'dependent' => true, ] ]; }
Controller/UsersController.php
set('users', $this->User->find('all')); } public function delete($id = 0){ if($this->request->is('get')){ throw new MethodNotAllowedException(); } if($this->Article->delete($id, true)){ $this->Session->setFlash(__('%s番の記事を削除しました', h($id))); return $this->redirect(['controller'=>'users', 'action'=>'index']); } } }
最後にView
View/Users/index.ctp
これで/users/にアクセスして削除をおしてみてください。 その後データベースを確認してうまく消えていますか?
User.phpの10行目をコメントアウトしてデータを入れなおしてもう一度消してみてください。 今度はリレーション先が消えていませんよね?それで僕は少しはまりましたw
最後に
CRUDというCakePHPのプラグインがあるのですが、その中身でdeleteメソッドの部分にcascadeを指定する場所がなかったので。あれ?これおかしいのかな?とか思ってた自分が一番おかしかったです(´・ω・`)
何事も常に見なおしてしっかり確認していかないとダメですね。
僕のようなことを繰り返さないためにも
技術評論社
売り上げランキング: 95,908