-
CakePHPでcondition付きのpaginate
投稿 6 2011年7月 by in 開発日誌 with 0 comments
Mac OS X Lion 早くこないかなー。
teruchiです。(下記内容はCakePHP 1.3.7で確認)
CakePHPのPginatorはModelが組み込まれてる状態なので、
簡単に扱える反面、カスタマイズが難しい。なんかのリストをステータスごとに絞り込みたい時、
社内用の管理画面であればこんな感じで書いてます。まずViewではPaginator::link()を使って
=$this->Paginator->link('全て', array('status' => ''))?>
=$this->Paginator->link('公開中', array('status' => 1))?>
=$this->Paginator->link('公開停止中', array('status' => 2))?>
=$this->Paginator->link('削除済み', array('status' => 9))?>
としてあげます。
これでページやソート条件が勝手にリンクにつくようになります。あとはコントローラー側で、
$this->paginate = array('order' => array('created' => 'DESC'));// 検索条件
if(!empty($this->params['named']['status'])) {
$this->paginate['conditions']['status'] = $this->params['named']['status'];
}$this->set('books', $this->paginate());
な感じで書いてあげれば条件付きで検索されます。では今月も良いコードを。
-
ガンダムのアニメ新作が準備中ということでわくわくしながらキーを叩くteruchiです。CakePHPで、モデルをbelongsToとかで関連付けしてて、
2階層目のモデルも一緒に引っ張ってきたい時ってありません?たとえば、
Book belongsTo Shop
Shop belongsTo City
みたいにつながってる状態で、
本(Book)を検索すると本屋さん(Shop)がある街の名前(City.name)も引っ張ってきたいなんてパターン。私はこんな感じでやってます。
// 本モデルに本屋さんモデルを関連付け
$this->Book->bindModel(array('belongsTo' => array('Shop')), false);// 本屋さんモデルに街モデルと店種別モデルを関連付け
$this->Book->Shop->bindModel(array('belongsTo' => array('City', 'Type')), false);// paginateのオプションにcontainを使って取ってくる情報を絞る
$this->paginate = array(
'order' => 'Book.updated DESC',
'contain' => array('Shop.id' => array('City.name', 'Type.name')));$this->set('books', $this->paginate());
ちょっとよけいなのも付いてますが(wポイントはbindModelの第2パラメーターにfalseを指定すること。
これでpaginate()に処理が移っても関連付けが外れなくなります。あとcontainを使ってShop.idを渡すとこ。
DBをフェッチする時の情報を減らします。(プチ減量)SQLをデバッグするとわかりますが、idの一覧を取ってきて、
関連付け先は個別にSELECTしてくれます。(それも問題だけど。。。)一覧で使う場合はあまりおすすめできないかな。。。
ちなみにapp_model.phpで
var $actsAs = array('Containable');
としてるのが前提です。(これ大事)それでは今日も良いコードを。