【问题标题】:CakePHP 2.0: Using paginate with hasMany and HABTMCakePHP 2.0:通过 hasMany 和 HABTM 使用分页
【发布时间】:2012-06-26 19:28:36
【问题描述】:

我有以下关系:

发布有很多评论

帖子属于类别

发布HABTM标签

我想使用带有这些属性的分页方法:

public $paginate = array(
    'published',
    'limit' => 3,
    'fields' => array(
        'Post.title',
        'Post.date_published',
        'Post.abstract',
        'Post.slug',
        'Category.value',
        'Category.slug'
    )
);

'published' 是一个自定义的查找查询,但在这里应该无关紧要。 除了有关帖子及其类别的信息(见上文)之外,我还想获取帖子的评论数以及所有标签的名称。即,我希望能够以方便的方式访问 View 端的数据,例如 $data['Post']['comment_count'] 和 $data['Post']['Tag'][0] ['名称']。

是否有足够优雅的解决方案?我知道 HABTM 可能有点复杂,但我什至不知道如何在同一个查询中获取评论,即使它只是一个 hasMany 关系。谢谢。

【问题讨论】:

    标签: cakephp has-and-belongs-to-many pagination


    【解决方案1】:

    我发现在Comment模型中使用counterCache参数如下

    public $belongsTo = array('Post' => array('counterCache' => true));
    

    在帖子表中添加 cmets_count 字段是获取帖子评论数的最简单解决方案。这将在添加或删除新评论时更新表格。

    关于标签,我使用了包含数组,它也可以用于分页。我是这样使用的:

    $this -> paginate = array(
            'published',
            'limit' => 3,
            'contain' => array(
                'Category',
                'Tag' => array('fields' => array(
                        'value',
                        'slug'
                    ))
            ),
            'fields' => array(
                'Post.title',
                'Post.date_published',
                'Post.abstract',
                'Post.slug',
                'Post.comment_count',
                'Category.value',
                'Category.slug'
            ),
            'conditions' => $conditions,
            'joins' => $joins
        );
    

    这样做,每个 Post 请求只获取类别和标签模型的字段 value 和 slug。

    有一种特殊情况,当我想获取具有特定标签的所有帖子时。请记住,这是一个 HABTM 关系。我偶然发现了这个有用的模型方法by Geoff Garbers

    将它添加到 AppModel,它允许调用 hasAndBelongsToMany,并自动执行为分页方法定义连接的繁琐过程。如您所见,它们是通过 $joins 数组添加的,该数组是使用上述方法生成的:

    $joins = $this -> Post -> generateHabtmJoin('Tag');
    

    现在可以轻松定义条件,例如:

    $conditions = array('Tag.slug' => $this -> request -> params['tag']);
    

    这只会获取具有特定 Tag.slug 的帖子。

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2013-01-01
      • 1970-01-01
      • 2010-12-08
      相关资源
      最近更新 更多