3

我是 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 的所有其他相关对象(项目、帖子、评论……),并且对象树比以前大得多。

所以我想知道,实现这个的正确方法是什么?我需要明确设置“加入”选项还是必须设置字段选项(在根或包含选项中)?

来自奥地利的问候。

4

7 回答 7

1
于 2012-01-13T00:46:46.837 回答
0

从理论上讲,这应该可以正常工作。确保您已设置

var $actsAs = array('Containable');

在您引用的每个模型上。

编辑:仔细看,也许不是。尝试以下...

$this->set(
  "posts", 
  $this->Post->find(
    "all", array(
      "conditions" => array("Post.wall_id" => $wall["Wall"]["id"]), 
      "contain" => array("Participant" => array("User"))
    )
  )
);
于 2011-11-15T11:30:39.690 回答
0

这是否有助于:

$this->loadModel('Participant');
                $this->Participant->bindModel(array(
                    'belongsTo' => array(
                        'User' => array(
                            'className' => 'Wish',
                            'foreignKey' => 'user_id'
                        )
                    )
                ),0);
$这个->设置(
  “帖子”,
  $this->发布->查找(
    “全部”,数组(
      "条件" => 数组("Post.wall_id" => $wall["Wall"]["id"]),
      “包含” => 假
    )
  )
);
于 2011-11-15T12:05:45.640 回答
0

我在我的一个项目中使用了 ContainableBehaviour,即使有大量关系,它也能完全按预期工作。我相信由于以下关系,它在您的情况下无法正常工作:

  • 参与者有很多帖子
  • 参与者有很多评论
  • 参与者属于帖子
  • 参与者属于评论

为什么参与者属于帖子?为什么参与者属于评论?

当您摆脱这些关系时,包含是否按预期工作?

如果您需要所有这些关系并正确设置了您的HABTM关系。查看这篇文章,它解释了如何将 ContainableBehaviour 与 HABTM 关系一起使用。

于 2011-11-15T12:12:10.410 回答
0

我从未使用过点语法。你试过了吗

"contain" => array('Participant'=>array('User'))

?

对我来说,似乎也没有附加可包含的行为。你是如何附加/激活你的行为的?

于 2011-11-15T12:24:27.773 回答
0

我一直在解决同样的问题,然后我发现在一些模型中我设置了 afterFind 回调和另一个 SQL 查询,这使得可包含的行为变得混乱。所以我建议将回调中的内部查询重写为纯 SQL,对我有帮助并解决了可包含链接。

于 2012-01-12T20:41:47.387 回答
0

First thing to do is in your parent model, set the propriety recursive to -1 like that $this->recursive = -1; by doing that cake will load only models we set in the contain array(). Thanks

于 2015-08-24T09:33:14.813 回答