我是 cakephp 的可包含元素的忠实粉丝,因为我一直认为它会处理适当的附加模型的加载。但在最后几天,我深入挖掘并发现,确实存在内存问题。
考虑以下模型结构:
- 项目有很多墙
- 项目有很多参与者
- 墙上有很多帖子
- 帖子有很多评论
- 参与者有很多帖子
- 参与者有很多评论
- 参与者属于用户
- 参与者属于项目
反之亦然
- 帖子属于参与者
- 帖子属于墙
- 评论属于参与者
- 评论属于帖子
- 用户有很多参与者
在墙控制器中,我有以下查找语句:
$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对象感兴趣,所以我将包含数组更改为 Participant.User。但是,再一次,现在我不仅获得了 User 对象,还获得了 Participant 的所有其他相关对象(项目、帖子、评论……),并且对象树比以前大得多。
所以我想知道,实现这个的正确方法是什么?我需要明确设置“加入”选项还是必须设置字段选项(在根或包含选项中)?
来自奥地利的问候。