私は常に、追加モデルのロードを適切に処理すると考えていたので、cakephp の包含可能な要素の大ファンです。しかし、ここ数日でさらに深く掘り下げたところ、実際にはメモリの問題があることがわかりました。
次のモデル構造を考えてください。
- プロジェクトには多くの壁があります
- プロジェクトには多くの参加者がいます
- 壁にはたくさんのポストがあります
- 投稿には多くのコメントがあります
- 参加者の投稿数が多い
- 参加者のコメントが多い
- 参加者はユーザーに属します
- 参加者はプロジェクトに所属しています
およびその逆
- 投稿は参加者に属します
- 投稿はウォールに属します
- コメントは参加者のものです
- コメントは投稿に属します
- ユーザーには多くの参加者がいます
wall-Controller には、次の find-Statement があります。
$this->set(
"posts",
$this->Post->find(
"all", array(
"conditions" => array("Post.wall_id" => $wall["Wall"]["id"]),
"contain" => array("Participant")
)
)
);
私は、cakephp がすべての投稿を見つけて、対応する参加者オブジェクトのみを含めることを期待しています。しかし、私が得るのは、すべての投稿 (正しい) とその参加者 (正しい) だけでなく、対応する壁 (正しくない) と対応するコメント (利用可能な場合) (正しくない) のリストです。したがって、パフォーマンスの観点からは、オブジェクトが多すぎるため、「致命的なエラー - メモリの過負荷」が発生する可能性があります。
そして、理論的に非常にセクシーで興味深い部分については、次のとおりです。
$this->set(
"posts",
$this->Post->find(
"all", array(
"conditions" => array("Post.wall_id" => $wall["Wall"]["id"]),
"contain" => array("Participant.User")
)
)
);
Post とParticipant.Userオブジェクトのみに関心があるため、contain-array を Participant.User に変更します。しかし、ここでも、User オブジェクトだけでなく、Participant に関連する他のすべてのオブジェクト (プロジェクト、投稿、コメントなど) も取得しており、オブジェクト ツリーは以前よりもはるかに大きくなっています。
だから、これを実装する正しい方法は何だろうと思っていましたか?「結合」オプションを明示的に設定する必要がありますか、それともフィールド オプションを (ルートまたは含むオプションで) 設定する必要がありますか?
オーストリアからのご挨拶。