复杂CakePHP数据返回与合并

复杂CakePHP数据返回与合并,php,arrays,cakephp,sql-order-by,Php,Arrays,Cakephp,Sql Order By,我的目标是在我目前正在开发的应用程序上创建一个活动摘要页面。我已确定我必须执行以下操作: [Username] has posted [StoryName] - View story 从我订阅的人那里获取所有故事,并按如下格式设置它们: [Username] has posted [StoryName] - View story 获取我连接到的用户发表评论的所有故事 [Username] has posted a comment on [StoryName] - View story 我不

我的目标是在我目前正在开发的应用程序上创建一个活动摘要页面。我已确定我必须执行以下操作:

[Username] has posted [StoryName] - View story
从我订阅的人那里获取所有故事,并按如下格式设置它们:

[Username] has posted [StoryName] - View story
获取我连接到的用户发表评论的所有故事

[Username] has posted a comment on [StoryName] - View story
我不确定如何获得这两个数组,以我想要的格式显示它们,但按发布日期排序(就像Facebook那样)

最好的办法是什么


请注意:答案必须是易于扩展的。我正在考虑遵循wordpress的模型,并创建一个包含Post Type字段的Posts表。

Gary,如果不知道您的模型,很难回答这个问题。假设您已经得到了正确定义的模式和模型,这应该相对容易

对于查找查询,请按日期顺序描述并检索最后10行。(例如,这将给出最后20个结果)


将结果集合并为一个,然后再次按日期描述排序。然后是一些琐碎的渲染逻辑,可以根据需要渲染字符串。

好吧,我会这样做

创建以下关系

用户有许多故事名

用户有许多评论

StoryName有许多评论

评论属于用户

评论属于故事名

这样就很容易检索到所有需要的信息,因为您可以通过用户模型获取所有需要的数据,比如

$this->User->recursive = 2;

$this->User->find('all', $params) *// on $params you could use the conditions that the user retrieved should be friends to the current user*
希望这会给我一个填充了以下结构的数组

[用户] [帖子] [评论]


只需将其传递给视图,并在视图中使用foreach创建Html,我不知道您是否已经设置了其他模型(用户、故事等)。但是为了回答这个问题,我将只关注活动模型(活动表):您可以像使用日志表一样使用这个表

一个简单的表:id、user\u id、story\u id、created(datetime)、action\u type(例如,0表示文章,1表示对文章的评论)。然后,只需查询此表以查找活动


或者一个更通用的、可扩展的类型:id、subject\u id、subject\u type(用户或任何正在行动的人)、动词类型、object\u id、object\u type、created。实际上,您不必将此模型绑定到任何其他模型(尽管您可以在指定关系时使用“条件”)或动态绑定模型。

您尝试执行的操作基本上是CakePHP内置的。重要的是要确保您的模型正确关联。一旦完成,蛋糕将为你完成大部分的重担

针对您的情况,请使用以下3种相关模型:

class Story extends AppModel{
    var $belongsTo = 'Author';
    var $hasMany = 'Comment';
}

class Author extends AppModel{
    var $hasMany = array( 'Story', 'Comment' );
    var $hasAndBelongsToMany = 'User';
}

class Comment extends AppModel{
    var $belongsTo = array( 'Author', 'Story' );
}
按照蛋糕惯例摆好桌子。然后在控制器中加入一点CakePHP魔法:

$this->Story->Author->bindModel( array( 'hasOne' => array( 'AuthorsUsers' ) ) );
$myAuthors = $this->Story->Author->find( 'list', array(
    'fields' => array( 'id' ),
    'conditions' => array( 'AuthorsUsers.user_id' => $userId ),
    'recursive' => false 
    ) );

$stories = $this->Story->find( 'all', array(
    'fields' => array( 'Story.id', 'Story.title', 'Author.id', 'Author.name' ),
    'order' => 'published_date DESC',
    'conditions' => array( 'Author.id' => $myAuthors ),
    'recursive' => 2
    ) );
快速解释发生了什么:

  • 让Cake知道您想使用HABTM关联通过关联的用户id查找作者。(Cake约定是使用一个名为“Authors\u users”的表加入作者->用户HABTM关联。)
  • 如果调试
    $myAuthors
    变量,您将看到它得到一个简单的ID数组
  • 'conditions'=>array('field'=>array())
    将被解析为“WHERE field IN(…)”。在本例中,我们得到所有模型
    ,其中$myAuthors中的'Author.id'
  • 简短的
    $this->Story->find()
    调用是蛋糕的妙处。它将自动查找与指定条件匹配的所有故事模型,并将查找与每个找到的故事关联的其他模型。(通过关闭或使用行为,您可以告诉它不要查找关联的模型。)
  • 调试
    $stories
    变量将显示如下结构:
然后,您可以在视图中使用该结构来显示所需的数据


我觉得应该有一种方法只需一个查询就可以做到这一点,但这种方法很有效,不需要您执行任何子查询,也不需要您在Cake
find()
调用中插入自定义SQL。

我确实有正确定义的模型和关系等,我也在考虑这条路径上的一些问题,对我来说,似乎最简单的方法是编写渲染逻辑,然后组合数组,但我真的不想在数组中有一大块html。理想情况下,我会有一些方法来区分一个用户评论过的故事和一个用户发布过的故事(尽管我每次都只是把故事拉出来),这就是我刚才设置模型的方式。但我仍然不确定如何以我想要的方式显示数据,因为没有标识符告诉我用户是否发布了故事或评论