CakePHPの印象とか
フルスクラッチで触るのは初めてなわけだけど、そこそこいいかな?
ただ、ドキュメントがいまいちだから調べるのが面倒。
BlogレベルではなくWikiレベルで誰かがしっかり情報整備してくれたら、もっと使いやすくなるんでないかなぁという印象。
公式がもうちょいリファレンス系 + サンプルのドキュメント整備をやらないと駄目だろーという印象。php.netはその辺上手かったし、見習えばいいのにな。
昨日てこずったのはこういうの。
<?php $this->paginate = array('Customer' => array( 'conditions' => $this->_getConditionByData(), 'group' => array('Customer.id'), 'joins' => array(array( 'type' => 'LEFT', 'alias' => 'CustomerAddress', 'table' => $this->Customer->tablePrefix.'customer_addresses', 'conditions' => 'Customer.id = CustomerAddress.customer_id' ),array( 'type' => 'LEFT', 'alias' => 'CAPref', 'table' => $this->Customer->tablePrefix.'prefs', 'conditions' => 'CustomerAddress.pref_id = CAPref.id' ) )));
controller側からpaginateで表示するデータの対象に、HasManyでのjoin対象テーブルを含めるようなやつ。
上の例だと、最終的にはCustomerから見て子供の子供であるCAPrefのデータから検索出来ればいい。別にCAPrefのデータはいらず、検索条件としてだけいる。
はじめはbindModelが使えるのかな?と思ったんだけど、bindModelで結合できるのはHasOneやbelongsToだけみたいで、検索結果が複数レコードになっちゃうようなものは駄目みたいだった。
ということでjoins使って自力でjoinして(tableだとプリフィックスが自動でつかないっぽいからtablePrefixでつけてやる必要あり。上の例だとCustomerのプリフィックスを使いまわしてるから適当じゃないかも。)、groupでdistinctしてようやっと出来た。
ドキュメントがしょぼいからこういう細かいとこで地味にはまる。
まあ、さすがはRailsをPHPでという思想っぽいので作られてるだけあって、一度覚えちゃえば早いけどね。
この初動でつまずく感じは、多くのPHPユーザにとって天敵なんでないかなとも思う。
2010/01/21 追記
Group Byしている時にpaginator->number()が表示されない件
今回はPaginateの際GroupByした条件を渡すと、paginator->number()が全く表示されないという現象に遭遇した。とりあえずcakephpのソースから読んで調べていきました。
という問題で俺の書いた実装だとページングが死んだ。
上記記事上に書いてある通り、app_modelに下記コードを追加すればいける模様。
<?php function paginateCount($conditions = null, $recursive = 0, $extra = array()) { $parameters = compact('conditions'); $this->recursive = $recursive; $count = $this->find('count', array_merge($parameters, $extra)); if (isset($extra['group'])) { $count = $this->getAffectedRows(); } return $count; } ?>
びびったぁ。てかさすがにこれはバグじゃないか?
とりあえず助かりました記事書いてくれたえらい人。