2014年6月6日金曜日

[CakePHP]find()のオプションのpageはlimitと併用しないと恐ろしい事に。。。

※CakePHP2.4.9のお話。
$page = 1;
do{
    $ids = $this->find('list',array(
        'page' => $page,
        'fields' => array('user_id'),
        'conditions' => //ある条件
    ));
    //ある処理
    $page++;
}while (!empty($ids));

こんな感じで、特定の条件全てのレコードに対してある処理をするバッチを作っていて、1pageあたりの数はデフォルト値を当然使ってくれるだろうと思っていたんだけど、これを実行したら、なかなか処理終わらずおかしいなと思ってたら、あるテーブルにありえない数のレコードがインサートされてる。。。無限ループ状態になっていました。あわてて、ApacheとMySQLをシャットダウンして、止めた。

というわけで、デバッグしたら、limitを明示的に定義していないと、実際SQLで使われるoffsetとlimitに値が入らないってことがわかった。

model.php 2942行目
if ($query['page'] > 1 && !empty($query['limit'])) {
    $query['offset'] = ($query['page'] - 1) * $query['limit'];
}
なので、以下のようにlimitを明示的に指定して直った。恐ろしや〜。
$page = 1;
do{
    $ids = $this->find('list',array(
        'page' => $page,
        'limit' => 20,
        'fields' => array('user_id'),
        'conditions' => //ある条件
    ));
    //ある処理
    $page++;
}while (!empty($ids));

0 件のコメント:

コメントを投稿