我的目标是为我目前正在处理的应用程序创建一个事件摘要页面。我已确定我必须执行以下操作:
从我订阅的人那里获取所有故事,并将它们格式化如下:
[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/