Cakephp PostgreSQLでランダムページング ITかあさん

ITかあさん

Cakephp PostgreSQLでランダムページング

少し前ですが、Cakephp ランダムな pagenateを実装するという記事を書いたのですが、同じランダムなページングでも、PostgreSQLでは全く同じとはいかないようでちょっと悩んでしまいましたので、メモ的に残しておきたいと思います。
前置きはそれくらいにして、Cakephp ランダムな pagenate in PostgreSQLの実装方法です。

結論:Sessionとランダム浮動小数点数、それからseed関数

(オレとお前となんとかかんとかみたいな。)
ポイントはSessionと浮動小数点を使うこと。基本的には以前のMysqlのランダムページングと考え方は一緒ですが、PostgreSQLにはseed関数が容易されていますのでそれを使います。

1.浮動小数点数を発生させる
2.浮動小数点数をSessionに保存する。
3.Sessionに保存した乱数を使ってページング処理を実行する

以上です。Sessionの使い方についてはこちらを参考にしてください
『CakePHP』を使ってみる ~11~ セッションの使い方確認 ざ・わーるど.jp@はてな

浮動小数点数

浮動小数点数とは、-1から1の間の小数点つきの数字のことです。
今回はこれをランダムで発生させなければなりません。
ランダムな浮動小数点数の発生のさせ方はPHPマニュアルを参考にしました。
PHP: mt_getrandmax – Manual

浮動小数点数をSessionに保存するComponentの作成

浮動小数点数をSessionに保存するComponentを作成します。
前回とほとんど一緒です。ただ浮動小数点数を保存しているだけです。

class SeedComponent extends Object {
 function initialize(&$controller) {
  $this->controller =& $controller;
  }
  function seed($min = 0, $max = 1) {
  if($this->controller->Session->read('seed') == ""){
  
  $int = $min + mt_rand() / mt_getrandmax() * ($max - $min);
  
  $this->controller->Session->write('seed', $int);
  }
  
  $seed = $this->controller->Session->read('seed');
  
  return $seed;
 }
}

Sessionに保存した浮動小数点数を使ってページング処理を実行

$seed = $this->Seed->seed();//浮動小数点数
//PostgreSQL seed
$this->Model->query('select setseed('. $seed .')');
$this->paginate = array(
'conditions'=>$conditions,
'limit'=>20,
'order' => array("RANDOM()"),
);

以上です。
Cakephp1.3はSessionを利用する際はSessionコンポーネントを呼び出すことを忘れないで下さい。
PostgreSQLはseed関数があらかじめ用意されているため、やり方さえ分かっていれば、Mysqlよりもランダムページングは簡単かもしれません。

初夏のJavaScript祭 in サーキュレーションビル ForPro