別のテーブルから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にチェックキューを追加する」みたいに、順次実行するキューを別テーブルに保存するときなんかに使っています。
