【发布时间】:2011-12-29 10:49:03
【问题描述】:
我是 cakephp 的可包含元素的忠实粉丝,因为我一直认为它可以处理适当的附加模型的加载。但在最后几天,我深入挖掘并发现,确实存在内存问题。
想想下面的模型结构:
- 项目有很多墙
- 项目有很多参与者
- 墙上有很多帖子
- 帖子有很多评论
- 参与者有很多帖子
- 参与者有很多评论
- 参与者属于用户
- 参与者属于项目
反之亦然
- 帖子属于参与者
- 帖子属于墙
- 评论属于参与者
- 评论属于帖子
- 用户有很多参与者
在墙控制器中,我有以下 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 对象感兴趣,所以我将包含数组更改为 Participant.User。但是,现在我不仅获得了 User 对象,还获得了 Participant 的所有其他相关对象(项目、帖子、cmets 等),并且对象树比以前大得多。
所以我想知道,实现这一点的正确方法是什么?我需要明确设置“加入”选项还是必须设置字段选项(在根或包含选项中)?
来自奥地利的问候。
【问题讨论】:
-
似乎包含根本不起作用...只是为了检查一下,您是否将可包含行为添加到模型中?
-
嗨,当然,所有模型都设置了行为,但如果我将其注释掉,它并没有什么不同。
-
您可能还需要将 recursive = -1 设置为您的 AppModel 默认值。
-
在 AppModel 中设置递归完全没有区别。 :-(
-
您好,您对此有什么发现吗?
标签: php cakephp cakephp-1.3 cakephp-model