どんなときに使うのかというと、
1 対 多 になっている関係の時、その1ユーザーごとの
・何度試験を受けたか
・最高点
・最低点
・合計点
・平均点
を知りたい場合などに大変便利だ。
まぁ、ここまでできればpaginateもほぼ完璧と言えよう。
そこで、今回はとりあえずコントローラーでの設定だけをメモる。
paginaotorを使えば virtual field でsortすることができるらしい。
それは次の回で。
全ユーザーが何度試験を受けたかをバーチャルフィールドにて取得
$this->paginate = array('User' =>
array(
'limit' => 10,
'order' => array('User.id' => 'desc'),
'joins' => array(
array('type' => 'inner', 'alias' => 'Shiken', 'table' => 'hideblog_shikens',
'conditions' => 'User.id = Shiken.user_id')
),
'group' => array('User.id'),//これが重要。ここでまとめないと、一つのテストに対して同じユーザーが何度も表示される。
'page' => 1)
);
$this->User->virtualFields = array('shiken_count' => 'count(Shiken.id)'); // SQL 発行前にバーチャルフィールド設定
$res = $this->paginate('User');
全ユーザーの合計スコアをバーチャルフィールドにて取得
$this->paginate = array('User' =>
array(
'limit' => 10,
'order' => array('User.id' => 'desc'),
'joins' => array(
array('type' => 'inner', 'alias' => 'Shiken', 'table' => 'hideblog_shikens',
'conditions' => 'User.id = Shiken.user_id')
),
'group' => array('User.id'),//これが重要。ここでまとめないと、一つのテストに対して同じユーザーが何度も表示される。
'page' => 1)
);
全ユーザーの試験を受けた回数、最高点、最低点、合計得点、平均点 を取得
$this->paginate = array('User' =>
array(
'limit' => 10,
'order' => array('User.id' => 'desc'),
'joins' => array(
array('type' => 'inner', 'alias' => 'Shiken', 'table' => 'hideblog_shikens',
'conditions' => 'User.id = Shiken.user_id')
),
'group' => array('User.id'),//これが重要。ここでまとめないと、一つのテストに対して同じユーザーが何度も表示される。
'page' => 1)
);
$this->User->virtualFields = array(
//そのユーザーが今まで取得した
'shiken_count' => 'count(Shiken.id)',//試験を受けた回数
'shiken_saikouscore' => 'max(Shiken.score)',//最高点
'shiken_saiteiscore' => 'min(Shiken.score)',//最低点
'shiken_goukeiscore' => 'sum(Shiken.score)/count(Shiken.id)',//合計得点
'shiken_heikinscore' => 'sum(Shiken.score)/count(Shiken.id)'//平均点を取得 (試験の合計点 / 受けた試験の回数)
);
こんな感じでどうよ。
参考:
http://d.hatena.ne.jp/hiromi2424/20100204/1265274976
ありがとうございました!







こんにちわ。 preg_replace_callba…