CakePHP2のModelのdeleteメソッドでリレーション先が消えないとき

みなさんこんにちは!

リレーションを組んでリレーション先も同時に消す方法を勘違いしていたので自分の戒めのためにメモとして残しておきます。


データを消すときは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

ID 名前 アクション
Form->postLink(__('削除'), ['controller'=>'users', 'action' => 'delete', $user['User']['id']], null, __('本当に削除しますか? # %s?', $user['User']['id'])); ?>

これで/users/にアクセスして削除をおしてみてください。
その後データベースを確認してうまく消えていますか?

User.phpの10行目をコメントアウトしてデータを入れなおしてもう一度消してみてください。
今度はリレーション先が消えていませんよね?それで僕は少しはまりましたw

最後に

CRUDというCakePHPのプラグインがあるのですが、その中身でdeleteメソッドの部分にcascadeを指定する場所がなかったので。あれ?これおかしいのかな?とか思ってた自分が一番おかしかったです(´・ω・`)

何事も常に見なおしてしっかり確認していかないとダメですね。

僕のようなことを繰り返さないためにも

CakePHP2 実践入門 (WEB+DB PRESS plus)
安藤 祐介 岸田 健一郎 新原 雅司 市川 快 渡辺 一宏 鈴木 則夫
技術評論社
売り上げランキング: 95,908

tagamidaiki.comの著者が教えるプログラミングスクール – class Tech(クラステック)

更新情報はFacebookページで!

ブログの更新、読んで役立つ他ブログの記事などを更新しています。




関連のある記事