ここんところ、wordpressは相変わらずずっとやりつつも、新しめのPHPフレームワーク「FuelPHP」を勉強しています。
まだまだフレームワーク初心者で、ほかのフレームワークなどでもちゃんと扱ったことがないせいか、DBテーブルのリレーションの使い方でひっかかっのでここにメモします。
こちらの記事などを参考にさせていただき、まずOrm\Morelからextendしたモデルクラスで$_belongs_toなどを設定するのはわかりました。
記事ではそれだけで出来るように書いてあるんですが、find()したデータをダンプしてもリレーション先のデータが出てきません。原因がわからなくてとても困りました。
しかし、これは僕の勘違いで、ドキュメントの説明をちゃんと読んだら意味がよく分かりました。英語だからってなんとなく流し読みしてしまうんですががんばって読まないとダメですね。当たり前ですね。
The Orm allows for both eager and lazy-loading of relationships. Eager loading means that some (or all) relations are fetched in the original query. Lazy loading means that the relations aren’t fetched until you request them.
// eager loading, using joins: $post = Model_Post::find('all', array('related' => array('comments'))); // or $post = Model_Post::find()->related('comments')->get(); // $post->comments is available without any further querying after this // or use lazy loading, it won't use joins but query a relation once requested // first get a "post", 1 query without join $post = Model_Post::find('first'); // now request the comments (not yet loaded), which will do another query without join automatically $comments = $post->comments;
http://docs.fuelphp.com/packages/orm/relations/intro.html#usage
これによればリレーションにはeager-loading と lazy-loading の二種類の使い方があって、
eager-loadingの場合は最初のfind()のときに同じクエリで指定したリレーションのデータもすべて読み込んでしまう。
lazy-loadingの場合は、リレーショナルなデータそのものが呼び出された時点でクエリを送る。
だから最初のfind()の時点でダンプしても出ないはずです。
lazy-loadingだと設定は楽ですが、もちろんクエリ数がやたら増えたりすることもあります。データの構造やレコード数によって使い分けが出来ると思います。なにか言ってることがおかしかったらすみません、ご指摘ください。
うーん、しかし、これだけでリレーションの設定ができるなんてすごく楽ですね。