CakePHP:进行复杂查找

时间:2010-10-11 12:04:15

标签: cakephp model cakephp-1.3

在我的应用程序中,我有一个线程评论系统,我称之为状态消息。我有几个模型如下

用户(id,name ......)

status_messages(id,message,......,user_id)

status_replies(id,message,......,status_message_id,user_id)

这是撰写评论系统的正确方法吗?

用户可以设置状态消息,他的朋友和他自己可以回复它。如果另一个用户回复我也想要提取他的详细信息。

alt text

3 个答案:

答案 0 :(得分:1)

使用模型public $actsAs = array('Containable');

中的可包含行为

然后,从用户控制器:

$userWithMessagesAndReplies = $this->User->find('first' => array(
        'conditions' => array(/* conditions for finding the user (User.id) */),
        'contain' => array(
            'StatusMessage' => array('StatusReply')
        )
    )
);

这只是一个例子。根据您查找的位置,您可以稍微更改上面的代码。我建议从模型方法而不是控制器返回find的结果,以便它可以重用。 (为了便于理解,我使用了一个控制器示例。)

答案 1 :(得分:1)

如果您需要线索评论系统,则应考虑使用find('threaded')Tree行为,{{1}}。

答案 2 :(得分:1)

我认为你不需要2张桌子。

使用单个消息表并创建两个都使用该表的模型。

I.E table = messages, Models = ProfileMessage, ProfileReply

In that table make sure there is a profile_id, a user_id
and a parent_id. Default all of these to null.

Relate the ProfileMessage as
    belongsTo User, 
    belongsTo Profile,
    hasMany ProfileReply

Relate the ProfileReply as
    belongsTo ProfileMessage using the foreignKey key in the association to make sure you reference the parent_id and profile_id,
    belongsTo User

然后你可以查询ProfileMessage,它应该显示所有子ProfileReply对象,就像它们来自一个单独的相关表一样。基本上,单级树结构将条目与同一表中的父条目相关联。