CakePHP 2.4.2:注释模型关系获取原始帖子';书名

CakePHP 2.4.2:注释模型关系获取原始帖子';书名,cakephp,model,relationship,cakephp-2.1,Cakephp,Model,Relationship,Cakephp 2.1,我有一个非常典型的评论模型,其中评论属于许多其他模型,如文章、评论、照片等,而这些模型中的每一个都有很多评论。下面是我如何在评论模型上建立关系 <?php App::uses('AppModel', 'Model'); class Comment extends AppModel { var $name = "Comment"; public $belongsTo = array( 'User' => array( 'className' =>

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

<?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.module_id=8)

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

//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'
));
然后,你会得到评论和他们的任何父母,不管它在哪种型号。之后,当您重复每个注释时,您可以执行case语句,或者执行
if(!empty())
之类的操作来确定哪个模型包含要显示的内容


(旁注:每次尝试使用“Original”时,使用相同的名称创建多个关联不是一个好主意)

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

你是对的,但这只是它不起作用的原因,而不是答案。如果他给每个人一个不同的别名,那么根本没有理由给他们别名——只需使用模型本身(根据我已经给出的答案)。“为每个关联选择唯一的别名(数组键)。”这就是答案。别名可以与模型类名相同,也可以不同。
'order'=>$this->alias'。created DESC'
给了我一个错误。如果必须更改为“Comment.created DESC”,则循环将不那么漂亮,但至少可以工作。谢谢。好的,我有两个问题,请看问题中的编辑。这是正确的答案,但它确实减慢了我的应用程序,因为我的数据库结构是如何设置的。我有文章,评论,照片,etc在不同的表和一个名为modules的表中,其中每个表都是一行,并且都有一个唯一的id。comments表有一个名为module_id的列。现在我将所有内容移动到posts表中,如果我有一个侧边栏,并且希望显示我可以设置查找条件的最新文章,则继续使用名为module_id的列模块id=3。无论如何,现在Post模型有很多注释,但注释只是返回Post的别名。除非您有大量的数据,否则我猜任何缓慢都是由于不正确的表索引(和/或缺少缓存)造成的。保持您希望的数据库表结构应该没有问题。我还添加了缓存,但它每5分钟清除一次,所以非常轻。我有很多数据。即使我有我的老方法,我也使用了一点缓存,它持续了30分钟,但速度非常慢。我把速度降低了大约300%,而不是用一个全新的问题来编辑你的问题,你应该把这个问题划掉,然后再问另一个问题,为什么你的内容没有按预期工作……等等,请参见问题
//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'
));