FuelPHPのORMはテーブル間のリレーションの設定ができますが、
一括読み込みと遅延読み込みというのがあって正確に理解して使えてなかったのでメモです。
- 一括読み込みは、 一部のリレーションは、元の参照で全てフェッチされている。
- 遅延読み込みは、 明示的にリレーションを要求するまでフェッチされない。
// 一括読み込み。join が使われます:
$post = Model_Post::find('all', array('related' => array('comments')));
// もしくは
$post = Model_Post::query()->related('comments')->get();
// これで $post->comments が使用可能です。これ以上のクエリは発生しません。
// もしくは、遅延読み込みを使用。joinは使われず、一度でも要求したときに改めてクエリが発生します。
// まず "post" を取得。join 無しの 1 クエリ。
$post = Model_Post::find('first');
// ここで (まだロードされていない) コメントを要求すると、 join 無しの別のクエリが自動的に実行されます。
$comments = $post->comments;
今回はサンプルなのでオブジェクトの中身までは記載しませんが、
実際にmodelを取得してvar_dumpなりで出力してみると、一括読み込みの方はオブジェクトにリレーションしたデータが紐づいていました。
遅延読み込みの場合は、参照した時にクエリが別途走りました。
全て一括でフェッチしておくのが正しいとも限らないですが、
relatedに関しては意識して使いたいものだなと思いました。