シェアする

  • このエントリーをはてなブックマークに追加

[CakePHP]他のテーブルのselect結果からinsertするメモ

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

シェアする

  • このエントリーをはてなブックマークに追加

フォローする