cakephp分页多个habtm

Posted

技术标签:

【中文标题】cakephp分页多个habtm【英文标题】:cakephp paginate multiple habtm 【发布时间】:2010-03-14 23:10:57 【问题描述】:

我有多个这样的习惯:

// 用户模型 var $hasMany = array('Post');

// 发布模型 var $hasAndBelongsToMany = array('Category', 'Tag');

// 分类模型 var $hasAndBelongsToMany = array('Post');

//标签模型 var $hasAndBelongsToMany = array('Post');

我试图获取所有帖子及其用户和标签(在某个类别内),不知何故,如果我获取标签,结果是错误的。

$this->paginate = array
(
    'Post' => array
    (
        'limit' => 2,

        'fields' => array(
            'Post.title', 'Post.content', 'Post.slug', 'Post.created',
            'Tag.name',
            'User.username', 'User.created', 'User.post_count', 'User.avatar_file_name'),

        'joins' => array
        (
            array(
                'table' => 'categories_posts',
                'alias' => 'CategoriesPost',
                'type' => 'inner',
                'conditions'=> array('CategoriesPost.post_id = Post.id')
            ),

            // FETCH USER
            array(
                'table' => 'users',
                'alias' => 'User',
                'type' => 'inner',
                'conditions'=> array('Post.user_id = User.id')
            ),

            // FETCH TAGS
            array(
                'table' => 'posts_tags',
                'alias' => 'PostsTag',
                'type' => 'inner',
                'conditions'=> array('PostsTag.post_id = Post.id')
            ),

            array(
                'table' => 'tags',
                'alias' => 'Tag',
                'type' => 'inner',
                'conditions'=> array('Tag.id = PostsTag.tag_id')
            ),

            array(
                'table' => 'categories',
                'alias' => 'Category',
                'type' => 'inner',
                'conditions'=> array('Category.id = CategoriesPost.category_id', 'Category.slug' => $slug)
            )
        )
    )
);

$posts = $this->paginate();

由于我是新手,谁能给我一个解决方案? 非常感谢...

【问题讨论】:

“错误”是什么意思?你能记录结果集吗? 好吧,如果我获取标签,那么结果是第一个帖子的循环。但是,如果没有提取任何标签,那么它会以正确的结果返回所有帖子。 【参考方案1】:

在尝试使用关联模型对结果集进行分页时,我遇到了类似的问题。我最终不得不手动将我的模型绑定在一起,运行查询,然后解除绑定,以便让 Cake 包含正确的数据。 (http://book.cakephp.org/view/86/Creating-and-Destroying-Associations-on-the-Fly)

您还可以尝试包含行为,这将允许您指定要包含在结果集中的模型。 Containable 是 1.2+ (http://book.cakephp.org/view/474/Containable) 的核心,否则你需要自己去获取它。

不过,我不太确定您为什么会有如此庞大的查询。我会更倾向于做类似以下的事情。

$this->Model->recursive = 2;
$this->Model->paginate();

并让 Cake 通过我的关联为我获取所有相关数据。然后我会使用条件数组(http://api.cakephp.org/class/controller#method-Controllerpaginate)调整返回值来指定类别。

对不起,这不是一个事实上的解决方案,但我自己是一个 CakePHP 爱好者!您可能会发现使用 DebugKit 更容易查看查询、结果等,http://github.com/cakephp/debug_kit

【讨论】:

嗨,David,我使用 Containable 来获取类别的标签和连接表。对我来说不是最好的解决方案,但至少我得到了我想要的

以上是关于cakephp分页多个habtm的主要内容,如果未能解决你的问题,请参考以下文章

Cakephp分页问题

Cakephp 分页按计算字段排序( COUNT )

如何在 cakePHP 的控制器中设置分页器页面

CakePHP 3:多订单导致分页?

CakePHP 3.0 中虚拟字段/实体属性上的分页排序链接

带有连接表字段排序的 Cakephp 分页不起作用