みなさんこんにちは!
リレーションを組んでリレーション先も同時に消す方法を勘違いしていたので自分の戒めのためにメモとして残しておきます。
データを消すときはdeleteメソッドを使ってcascadeをtrueにすればリレーション先も消してくれると思っていました。
ただドキュメントよく見ると、この値、defaultではtrueなんですよね・・・
これではうまく消えない・・・ではどうすればいいのかというとリレーションを組んでいる部分でdependentオプションをtrueにしておかなければならないのです(´・ω・`)
つまり2箇所をしっかりtrueにしておけばリレーション先もうまく消えてくれる、ということです。
これだけではブログ記事としてはなんだかなぁなので一応確認しておきます。
データベース、コードの確認
CakePHPは前まとめたもので作ってあることを前提とします。
試してみたい方は以下の記事でプロジェクトを作る部分までやっておいてください。
CakePHP2をComposerでインストールしてプロジェクトを立ち上げるまで
そしてデータベースは以下のようなものを準備します。適当なので気にしないでください。
CREATE TABLE IF NOT EXISTSusers
(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 EXISTSitems
(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 INTOusers
(id
,name
,created
,modified
) VALUES (1, 'test1', NOW(), NOW()); INSERT INTOitems
(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
ID | 名前 | アクション |
---|---|---|
Form->postLink(__('削除'), ['controller'=>'users', 'action' => 'delete', $user['User']['id']], null, __('本当に削除しますか? # %s?', $user['User']['id'])); ?> |
これで/users/にアクセスして削除をおしてみてください。
その後データベースを確認してうまく消えていますか?
User.phpの10行目をコメントアウトしてデータを入れなおしてもう一度消してみてください。
今度はリレーション先が消えていませんよね?それで僕は少しはまりましたw
最後に
CRUDというCakePHPのプラグインがあるのですが、その中身でdeleteメソッドの部分にcascadeを指定する場所がなかったので。あれ?これおかしいのかな?とか思ってた自分が一番おかしかったです(´・ω・`)
何事も常に見なおしてしっかり確認していかないとダメですね。
僕のようなことを繰り返さないためにも
技術評論社
売り上げランキング: 95,908
更新情報はFacebookページで!
ブログの更新、読んで役立つ他ブログの記事などを更新しています。