Home > アーカイブ > 2008-03

2008-03

CakePHP Model#save()のSELECT文を抑制する

この記事の所要時間: 154

Model#save()でUPDATE文が発行される際は、まず該当ID(primary key)がDBに存在するかを確認するSELECT文が発行されて、存在すればUPDATE文が発行されます。

1レコードだけを更新するなら特に気にする必要は無いのですが、大量のレコードを逐次UPDATEする際はこのSELECT文を抑制したくなります。

そこでこのSELECT文を抑制する方法を調べてみました。

1. Model#$__exitstsにtrueを入れる

ちょっと強引な方法ですが、save()を実行する直前でModel#$__exitstsにtrueを入れると、SELECT文が発行されません。

Model#$__exitstsはsave()実行後、nullにリセットされるので元の値を戻す必要はありません。

    // FooがModel
    $this->Foo->__exists = true;
    $this->Foo->save($data);
    $this->Foo->save($data); // こちらはSELECT文が発行される

2. Model#exists()を継承する

SELECT文はModel#exists()で発行されるのでこれを継承して実行を抑制する方法です。

下のソースのように抑制するか否かでフラグを持たせると使い勝手が良いでしょう。

[app/app_model.php]

<?php
class AppModel extends Model {
  public $checkExists = true;

  public function exists($reset = false) {
    if ($this->checkExists) {
      return parent::exists($reset);
    }

    return true;
  }
}
?>

使う側

    $f = $this->Foo->checkExists; // フラグ値を保存
    
    // FooがModel
    $this->Foo->checkExists = false; // 抑制
    $this->Foo->save($data);
    
    $this->Foo->checkExists = $f; // フラグ値戻す

手軽で使い勝手も良いのは1.ですが、いちおうModel#$__existsは(コメント上では)privateのようなので、2.の方がお行儀の良いコードですね。:-D

Home > アーカイブ > 2008-03

検索
フィード
メタ情報

Return to page top