別のテーブルからselectして、その結果をinsertするのは基本的な作業ですが、CakePHPを使っていると、ついついfindしてきた結果を配列に入れて、saveしてしまったりします。
そうすると、レコードの数だけinsertを回すことになるので非常に非効率。
基本に立ち返ってselect結果から直接insertする方法をメモしておきます。
別のテーブルのselect結果をそのままinsertする
クエリーはこんな感じ。
sitesテーブルのselect結果をsite_existsテーブルにinsertする。
INSERT INTO site_exists (title, url, crated, modified) SELECT id, url, NOW(), NOW() FROM sites WHERE sites.deleted = 0;
CakePHPで上記クエリを実行するにはこう。
以下はコントローラで実行する場合。
(略) $this->loadModel("SiteExist"); $sql = "INSERT INTO site_exists (title, url, crated, modified) "; // 最後の半角スペース忘れずに。 $sql .= "SELECT id, url, NOW(), NOW() FROM sites "; // ここも忘れずに。つながっちゃうから。 $sql .= "WHERE sites.deleted = 0;"; if (!$this->SiteExist->query($sql)) { $this->Session->setFlash("あかんがな!"); } else { $this->Session->setFlash("成功"); } (略)
例えば僕は「sitesに登録されたurlが存在しているかをチェックするときに、site_existsにチェックキューを追加する」みたいに、順次実行するキューを別テーブルに保存するときなんかに使っています。