CakePHPでの多数レコードへのバッチ処理

現在、テストフェーズに入っているサイトで不具合発見。6万レコードのテーブルに対して再処理を行う必要があります。

CakePHPで開発しているので、すべてのレコードをfind(“all”)で取得してから処理するのでは、おそらくメモリのオーバーフローで止まることは確実です。そこで、レコードを分割して取得して処理することにします。

CakePHPのモデルに対するfindメソッドはよく使うのですが、意外とパラメータに関してはマニュアルに丁寧に説明してくれていません。しかし、

array(
'conditions' => array('Model.field' => $thisValue), //条件の配列
'recursive' => 1, //int
'fields' => array('Model.field1', 'DISTINCT Model.field2'), //フィールド名の配列
'order' => array('Model.created', 'Model.field3 DESC'), //文字列か配列でのorder定義
'group' => array('Model.field'), //GROUP BYするためのフィールド
'limit' => n, //int
'page' => n, //int
'offset' => n, //int
'callbacks' => true //false, 'before', 'after'が指定できます。
)

MySQLを使っているのであれば、limit,offsetは想像付くのですが、pageって何?っていうところでしょうか?

CakePHPのソースファイル(cake/libs/model/model.)のfind()の部分を読むとわかるのですが、page(ページ数)とlimit(表示レコード数)を指定すれば自動的にoffset(先頭からのレコード位置)を計算してくれるのでした。

他にマニュアルにないパラメータがあるかもしれませんので、CakePHPのソースは読んだ方がいいかもしれません。といいながら、callbacksは何をするのか自分はわかりませんが。

投稿者:

avatar

ando

50過ぎてもプログラマーの気持ちを忘れない。