開発合宿関西3に参加し、CakePHP-MongoDB Mapperを進化させました


GW終盤に滋賀県の琵琶湖近くで開催された開発合宿関西3に参加しました(この記事書いてる間はまだ参加中)。周りに何も無い宿に泊まって、みんなで開発するというスタイルで、2泊3日が基本構成。自分は1泊だけ参加。誰かと共同で開発というよりも、普段なかなか出来ない事や、まとまったタスクを消化するなど、各自もくもくと開発してました。
そういえば、電車でiMacを持ってきた人がいたw ボストンバックにiMac 20インチぐらいのやつを入れて持ってきたみたい。関西スゴイ。


合宿の雰囲気はこんな感じ(去年のmsngさんの記事)
http://www.msng.info/archives/2010/05/acty_plaza_biwa.php


こういった開発合宿は初参加だったのですが、良かった点がいくつかあって

  • 周りに何もないので集中できる
  • 金を払って参加してるのだから何かしら成果を出さないと、というプレッシャー
  • 周りの人の集中度に刺激されて開発がさくさく進む
  • 3食付いてるので外食しなくてよい(時間節約)
  • 雑談で技術的なトピックが多い

やはり、ここまできたら何かしら成果だすという勢いと、周りの環境で集中できました。時間はあり余ってるので、雑談もしやすいし、雑談も技術的な話があって面白かったです。


今回は、CakePHP-MongoDB MapperのIssueチケット消化と、kanael.netのリファクタリングを目標にしてましたが、Issueチケットが片付いた時にメールが来て、CakeMongo MapperでhasMany, blongsToとか出来ないの?っていう質問が来たので、急遽これの対応を行いました。
実は今までもhasManyなどのリレーションのリクエストは来てたのですが、MongoDBはサブドキュメントといった1レコードに複数の階層を管理できる機能があるため、あえてhasManyとか作る必要もないだろと思ってスルーしてました(MongoDBにはJoin機能も備わってないし)。ただ、要望が多くなってきたので、合宿の勢いで取り組みました。たぶん合宿じゃなかったらまたスルーしてたと思う。開発合宿++


やったことは、findの結果を元にリレーション設定があれば、他のテーブル(コレクション)にもfindを再帰的にかけていって手動で結果を結合していくという実装を行いました。これで複数テーブルにまたがるデータもfind一発で取得可能となりました。現在、hasMany,hasOne,belongsToに対応しています。詳細はコミットをご覧ください。
https://github.com/ichikaway/cakephp-mongodb/commit/9b3467fd7f6c024a800f29fe61679f57eab292d2

リレーションを考慮したデータの保存saveAll()のほうはどうなんだ?と思って試してたのですが、CakePHPのモデル側でうまくキーのセットなどをしてくれてすんなり保存できたので、特に新規で開発することはありませんでした。saveAll()やfindの方法などを確認したい場合は、下記の書いてる途中のテストケースをご覧ください。
https://github.com/ichikaway/cakephp-mongodb/commit/923a3bbb9e1692f7d560ca92f49e84927fb5a6bb


今はrelationブランチを作って開発してますが、テストケースを書き上げたらmasterにマージする予定です。