CakePHP - 我如何收到相关对象?

时间:2010-10-23 18:55:06

标签: php cakephp orm

我正在尝试将所有commments与我当前的post相关联,我的做法如下:

$this->Post->Comment->find('all', array('conditions' => array('post_id' => $id)));

但在我看来,这有点令人不安。我为什么要给post_id?我希望Comment与当前Post相关并不明显吗?

2 个答案:

答案 0 :(得分:1)

$this->Post->Comment-> ...指的是模型结构。 $this表示此类的此实例,而不是当前记录。

所以$this是PostsController,$this->Post是Post模型,$this->Post->Comment是Comment模型。这些都不是指特定的记录。

$this->Post->id只有在先前的查询(在此方法中)检索到明确的结果时才会被设置,我只依赖它在$this->MyModel->save($data)之后立即设置,否则我明确地设置它,如:< / p>

$this->MyModel->id = $id;

就个人而言,我会按如下方式进行,并在一个语句中检索所有必需的相关数据:

$this->Post->contain(array('Comment')); // If you're using containable, which I recommend. Otherwise just omit this line.
$this->Post->read(null,$id);

现在,您将在这样的数组中包含Post及其相关注释:

Array
(  
    [Post] => Array
        (
            [id] => 121
            [title] => Blah Blah an More Blah
            [text] => When the bar is four deep and the frontline is in witch's hats what can be done?
            [created] => 2010-10-23 10:31:01
        )
    [Comment] => Array
        (
            [0] => Array
                (
                    [id] => 123
                    [user_id] => 121
                    [title] => Alex
                    [body] => They only need visit the bar once in the entire night.
                    [created] => 010-10-23 10:31:01
                )
            [1] => Array
                (
                    [id] => 124
                    [user_id] => 121
                    [title] => Ben
                    [body] => Thanks, Alex, I hadn't thought of that.
                    [created] => 010-10-23 10:41:01
                )
        )
)

...你得到这样的评论:

$comments = $this->data['Comment'];

您想要的所有内容(您可以在contain()调用中进行微调)都会在一个方便的数据包中返回。顺便说一句,如果你还没有阅读可包含的行为。越早开始使用它,生活就会越轻松。

答案 1 :(得分:0)

如果您未指定条件($this->Post->Comment->find('all');),您将获得所有评论及其相关记录。

建议在条件中指定型号名称:$this->Post->Comment->find('all', array('conditions' => array('Comment.post_id' => $id)));。这样,您将获得特定帖子和所有相关(评论)数据的评论。

如果您不喜欢'conditions'数组,则需要明确指定标识为Leo(来自Post控制器):

$this->Post->id = $id;
$this->Post->read();

这样您就可以获得帖子以及与之相关的所有数据。

请注意,在第一种方法中,您检索与注释和第二种方法相关联的所有数据 - 与帖子关联的所有数据。