同じクラスの Active Record オブジェクトの配列があります。そのオブジェクトには定義済みの関係があります。「親」オブジェクトが初期化された後、関連するオブジェクトを「一括」で読み取る方法はありますか?
例 AR クラスPost、User、Comment * Post *をクラスUserへのリレーション所有者(BELONGS_TO) と、クラスComments へのリレーションコメント(HAS_MANY) を定義しました。
クラスPostのオブジェクトの配列$postsがあります。別の理由で、$postsを最初から初期化することはできません
'with' => array('owner', 'comments')
私がこれを行う場合:
foreach ($posts as $post) {
var_dump($post->owner);
var_dump($post->comments);
}
$postごとに、所有者を取得するためのクエリとコメントを取得するためのクエリを作成する必要があります。これにより、多くのクエリが発生し、スクリプトの実行が遅くなる可能性があります。より良いアプローチは、1 つのタイプのすべての関連オブジェクトを 1 つのステップで読み取ることです。
オブジェクトの配列の特定の関係に関連するすべてのオブジェクトを取得するために、このようなものは存在しますか?:
Post::readRelatedObject($posts, 'owner');
Post::readRelatedObject($posts, 'comments');
いくつかの理由から、このアプローチが必要です。
- リレーションを初期化する必要があるかどうかを事前に判断できないことがあります。
- 結合が遅くなる可能性があるため、「親」の後に関連するオブジェクトを読み取る方がはるかに高速になる可能性があります。
- 「親」オブジェクトが関連オブジェクトと同じキャッシュ時間を持てない場合があるため、キャッシュが影響を受ける可能性があるため、親オブジェクトがキャッシュから抽出された後に、関連オブジェクトをグループ化/一括で読み取ることが役立つ場合があります。例: $postはキャッシュされましたが、投稿と一緒に最後の 3 つのコメントをキャッシュできません。
yii にはこのようなものが含まれていますか? または役立つプラグインですか?
ありがとうございました