php - 复杂的 CakePHP 数据返回和组合

标签 php arrays cakephp sql-order-by

我的目标是为我目前正在处理的应用程序创建一个事件摘要页面。我已确定我必须执行以下操作:

从我订阅的人那里获取所有故事,并将它们格式化如下:

[Username] has posted [StoryName] - View story

获取我连接的用户发表评论的所有故事

[Username] has posted a comment on [StoryName] - View story

我不确定如何获得这两个数组,以我想要的格式显示它们,但在发布日期之前对它们进行排序(就像 Facebook 这样的人所做的一样)

解决这个问题的最佳方法是什么?

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

最佳答案

您尝试做的几乎是 CakePHP 内置的。重要的是确保您的模型正确关联。完成此操作后,Cake 将为您完成大部分繁重的工作。

根据您的情况,使用 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' );
}

根据 Cake 惯例设置您的表格。然后在您的 Controller 中使用一点 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
    ) );

快速解释发生了什么:

  • bindModel()让 Cake 知道您想使用 HABTM 关联通过关联的用户 ID 查找作者。 (Cake 约定是有一个名为 'authors_users' 的表加入 Author->User HABTM 关联。)
  • 如果调试 $myAuthors 变量,您会看到它得到一个简单的 ID 数组。
  • 'conditions' => array( 'field' => array() ) 将被解析为“WHERE field IN (...)”。在此示例中,我们获取所有模型 WHERE 'Author.id' IN $myAuthors
  • 简短的 $this->Story->find() 调用是 Cake 的美妙之处。它会自动找到所有匹配指定条件的 Story 模型,并且它会找到与每个找到的 Story 关联的其他模型。 (您可以通过关闭 Recursive 或使用 Containable 行为告诉它不要查找关联模型。)
  • 调试 $stories 变量将显示如下结构:
Array
(
    [0] => Array
        (
            [Story] => Array
                (
                    [id] => 1
                    [title] => 'Common Sense'
                    [published_date] => 1776-01-10 
                )
            [Author] => Array
                (
                    [id] => 1
                    [name] => 'Thomas Paine'
                )
            [Comment] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [text] => 'Revolutionary!'
                            [Author] => Array
                                (
                                    [id] => 3
                                    [name] => 'Silence Dogood'
                                )
                        )
                    [1...n] => ...
                )
        )
    [1...n] => ...
)

然后您可以在 View 中使用该结构来根据需要显示数据。

我觉得应该有一种方法只需要一个查询就可以做到这一点,但这种方法行之有效,不需要您执行任何子查询或将自定义 SQL 插入到您的 Cake find() 打电话。

关于php - 复杂的 CakePHP 数据返回和组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7299502/

相关文章:

javascript - 如何将幻灯片范围的值设置为php变量?

java - JSON异常 : No value for id

php - WordPress <?php body_class(); ?> 问题

arrays - Hibernate SQLQuery,如何获取数组和行对象?

Java 我该如何解析这个?

php - 通过一系列键在多维数组中深入获取值

c - 不理解自定义 C shell 的逻辑

php - 如何在不执行一长串 "OR"条件的情况下找到模型的所有记录?

cakephp - 在 CakePHP 中使用 AJAX 检索数据

mysql - CakePHP 复杂地查找名称中的条件字符