0

我有一个非常典型的评论模型,其中评论属于许多其他模型,例如文章、评论、照片等,而这些模型中的每一个都有很多评论。这是我在评论模型上建立关系的方式......

<?php
App::uses('AppModel', 'Model');

class Comment extends AppModel {

var $name = "Comment";


public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Article' => array(
        'className' => 'Article',
        'foreignKey' => 'post_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Photo' => array(
        'className' => 'Photo',
        'foreignKey' => 'post_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Review' => array(
        'className' => 'Review',
        'foreignKey' => 'post_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);
}

这就像一个魅力,如果我正在查看一篇特定的文章,那么我可以从该文章中检索所有评论,并且它对其他模型的工作方式相同。我要做的是显示所有带有原始帖子标题的最新评论,无论原始帖子来自什么模型(文章,评论,照片等),格式为$comment['Original']['title']. 我认为在 Comment 模型的 belongsto 中添加以下代码会起作用,但它不会....

    'Original' => array(
        'className' => 'Article',
        'foreignKey' => 'post_id',
        'conditions' => array('Comment.module_id' => 3),
        'fields' => '',
        'order' => ''
    ),
    'Original' => array(
        'className' => 'Review',
        'foreignKey' => 'post_id',
        'conditions' => array('Comment.module_id' => 2),
        'fields' => '',
        'order' => ''
    ),
    'Original' => array(
        'className' => 'Photo',
        'foreignKey' => 'post_id',
        'conditions' => array('Comment.module_id' => 8),
        'fields' => '',
        'order' => ''
    ),

不幸的是,如果最近的评论是在一张照片上,这只会显示正确的标题(Comment.module_id = 8)

4

2 回答 2

2

您可以使用 CakePHP 的Containable Behavior并执行以下操作:

//within a method of the Comment model
$recentComments = $this->find('all', array(
    'contain' => array(
        'Article',
        'Photo',
        'Review',
        'User'
    ),
    'limit' => 10,
    'order' => $this->alias . '.created DESC'
));

然后,您将取回评论和他们的任何父母,无论它在哪个模型中。之后,当您重复每条评论时,您可以做一个案例陈述,或者做一些if(!empty())事情来确定哪个模型有内容你想显示的。

(旁注:每次尝试使用“原始”创建多个具有相同名称的关联并不是一个好主意)

于 2013-04-24T20:44:22.297 回答
0

您仅收到带有条件的评论也就不足为奇了Comment.module_id = 8。你犯了一个基本的 PHP 错误。Original通过多次使用相同的键,您每次都有效地覆盖它的值。为每个关联选择唯一的别名(数组键)。

于 2013-04-24T20:52:01.840 回答