cakePHPのfindByにrecursiveを設定する方法
CakePHPをはじめてまだ数日ながら CakePHP プログラマーズ リファレンスガイド があるけど、ところどころ内容が実装と一致してなかったりする気がする。
リファレンスによると
$recursive オプションが1より大きい値に設定されている場合、findAll() オペレーションは、 findAll() で見つかった関連モデルに関しても結果を返します。
って書いてあって、原文見ても
When the $recursive option is set to an integer value greater than 1, the findAll() operation will make an effort to return the models associated to the ones found by the findAll().
と書いてある。
でも $recursive = 0 にしても関連づけたモデルのデータが帰ってくるので、コードを追ってみたら
cake_1.1.14.4797/cake/libs/model/datasources/dbo_source.php に
foreach($model->__associations as $type) {
foreach($model->{$type} as $assoc => $assocData) {
if ($model->recursive > -1) {
$linkModel =& $model->{$assoc};
$external = isset($assocData['external']);
if ($model->name == $linkModel->name && $type != 'hasAndBelongsToMany' && $type != 'hasMany') {
って書いてあるので、正しくは -1 より大きいときに関連するモデルが帰ってくる。1.1.12のときでも0より大きいときだし、ドキュメントが古い模様。というよりかは、はじめは 1 だったのが 0 になって -1 になったということだから、はじめの設計でいろいろ見落としてたということか。
findBy* でrecursiveを設定して関連するモデルをとってこないようにしたかったんだけど、ドキュメントだと findBy* は
findAllBy($value);
string $value;
という引数しかとらないと書かれていてrecursiveが設定できない雰囲気ですが、コード読んでみたらぜんぜん可能でした。
$user = $this->User->findByName( $name,
null, // fields
null, // order
-1 // recursive
);
で指定できます。
先が思いやられます。synfonyにすればよかったかも。コードちらっと見たかんじかっこよさそうだった。でもちらっと見たかんじだったらRoRのほうが圧倒的によかったけどPHPなので。
15分で作れる範囲をちょっとこえたところをまとめたフレームワークのレビューが読みたい!

1 Comment
Jump to comment form | comments rss [?] | trackback uri [?]