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してようやっと出来た。
ドキュメントがしょぼいからこういう細かいとこで地味にはまる。


まあ、さすがはRailsPHPでという思想っぽいので作られてるだけあって、一度覚えちゃえば早いけどね。
この初動でつまずく感じは、多くの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;
}
?>

びびったぁ。てかさすがにこれはバグじゃないか?
とりあえず助かりました記事書いてくれたえらい人。