2010年08月27日

paginateの設定

pagnaterの設定がわけわからん。
ある程度のレベルになるとSQLクエリを書かないと行けないのか。

でも、書き方がわからん。
ということでまとめてみます。

DB情報


hideblog_users テーブル として id , name (1対)
hideblog_shikens テーブル として id user_id kamoku score (多)



で、目的別にコントローラーの書き方を。

ユーザーID順にとりあえず並べてみる


$this->paginate = array('User' =>
	array(
		'order' => array('User.id' => 'desc')
	)
);

$res = $this->paginate('User');


NG:試験のスコア順に並び変えるには、これでは動かない


$this->paginate = array('User' =>
	array(
		'order' => array('Shiken.score' => 'desc')
	)
);

$res = $this->paginate('User');


ユーザーの情報だけ、取得したい


//contain 編
$this->paginate = array('User' =>
    array(
        'order' => array('User.id' => 'desc'),
        'contain' => false
    )
);

//unbind model編
//第二引数の false が重要!これがないとバグる
$this->User->unbindModel(array('hasMany' => array('Shiken')),false);

$this->paginate = array('User' =>
    array(
        'order' => array('User.id' => 'desc')
    )
);


試験を受けていない人 (Shiken) テーブルにデータが無い人は表示させたくない


$this->paginate = array('User' =>
array(
    'joins' => array(
    	array('type' => 'inner', 'alias' => 'Shiken', 'table' => 'hideblog_shikens',
    		'conditions' => 'User.id = Shiken.user_id')
    	),
        
    'group' => array('User.id'),//これが重要。ここでまとめないと、一つのテストに対して同じユーザーが何度も表示される。
    )
);

//もっとわかりやすく書くと、こう!
// type を inner にするのが味噌
$this->paginate = array('User' =>
array(
	'joins' => array(
		array('type' => 'inner', 'alias' => 'Shiken(多 の モデル名)', 'table' => 'hideblog_shikens(prefix を含む DB名)',
		'conditions' => 'User.id = Shiken.user_id(メインモデルの モデル名.id , 多のモデル名. foreignKey名)')
	),
	'group' => array('User.id'),//メインモデルの モデル名.id これが重要。ここでまとめないと、一つのテストに対して同じユーザーが何度も表示される。
	)
);


まだまだ次の記事に続きますよ!


関連するタグ: PHP cakephp MYSQL
あなたにとって有用な記事でしたか?是非ブックマークしておくことをおすすめします。



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