こんにちは、らいあです。
Dinoのプログラマーは毎日いろんなツールや関数を作って遊んでいます。
僕が今日作った関数を紹介しますね。
Peerクラスにペタって貼り付けると使えます。
プログラムって楽しいですよね!
/**
* 結果セットを指定関数に渡すdoSelectです。
*
* 膨大な結果セットをループでまわしたいときに使うと良いでしょう。
* 内部的には$LIMITレコードずつOFFSET/LIMITをかけながらSQLを回します。
* ※つまりアトミックでないことに注意すること
*
* @param function $proc 行オブジェクトを第一引数に受け取る関数
* @param Criteria $crit
* @param array options そのまま関数の第二引数に渡されます
*/
public static function doSelectLimitedForeach($crit, $proc, $options=array())
{
static $LIMIT = 100;
$orgOffset = $crit->getOffset();
$orgLimit = $crit->getLimit();
$endBounds = $orgLimit+$orgOffset;
for ($offset=$orgOffset; $offset<$endBounds; $offset+=$LIMIT) {
if ($offset+$LIMIT > $endBounds) {
$limit = $endBounds-$offset;
} else {
$limit = $LIMIT;
}
$crit->setOffset($offset);
$crit->setLimit($limit);
foreach (self::doSelect($crit) as $it) {
$proc($it, $options);
}
}
}
/**
* 結果セットを指定関数に渡すretrieveByPKsです。
*
* 膨大な結果セットをループでまわしたいときに使うと良いでしょう。
* 内部的には$LIMITレコードずつSQLを回します。
* ※つまりアトミックでないことに注意すること
*
* @param function $proc 行オブジェクトを第一引数に受け取る関数
* @param array $idList IDの一覧
* @param array options そのまま関数の第二引数に渡されます
*/
public static function retrieveByPKsLimitedForeach($idList, $proc, $options=array())
{
static $LIMIT = 100;
for ($offset=0; $idList; $offset+=$LIMIT) {
$target = array_splice($idList, $offset, $LIMIT);
foreach (self::retrieveByPKs($target) as $it) {
$proc($it, $options);
}
}
}
コメント / トラックバック 1 件
$procの使い方始めてみました
call_user_funcより簡単ですね
コメントする