2010年08月30日

paginate で virtual field

cakephp1.3 から virtual field というものがあるらしい。

どんなときに使うのかというと、
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
ありがとうございました!
関連するタグ: PHP cakephp MYSQL
あなたにとって有用な記事でしたか?是非ブックマークしておくことをおすすめします。



トップ - 最新の記事一覧 - お問い合わせ