habtm relationship - cakephp“复杂”查询

时间:2011-11-15 11:11:21

标签: cakephp entity-relationship

我正在为我的cakephp网站构建一个标签云,我无法构建“cakephp查询”:

模特:

Tag hambt Post
Post hambt Tag

db:

tags(id, name)
posts_tags(#post_id, #tag_id)
posts(id, title, ....)

sql查询:

SELECT tags.name, COUNT(*)+10 AS fontsize
FROM tags, posts_tags
WHERE tags.id = posts_tags.tag_id
GROUP BY posts_tags.tag_id
ORDER BY tags.name ASC

结果:

objective-c 11
PHP         12
test        11
test2       11
test3       12
tutoriel    13

问题:

我想以这种方式构建查询(我知道我可以使用$ this->查询,但这不是一个复杂的查询,必须有一种方法)但它不起作用:

$opt = array(
    'fields' => array('Tag.name','COUNT(*)+10 AS fontsize'),
    'group' => array('PostsTag.tag_id'),
    'order' => ....
);

$tags = $this->Post->Tag->find('all', $opt);

编辑:这里的答案(谢谢戴夫)

$options['fields'] = array('Tag.name', 'COUNT(*) occurence');
$options['joins'] = array(    
    array(
        'table' => 'posts_tags',
        'alias' => 'PostsTag',
        'type' => 'inner',
        'conditions' => array(
            'Tag.id = PostsTag.tag_id'
        )
    ),
    array(
        'table' => 'posts',
        'alias' => 'Post',
        'type' => 'inner',
        'conditions' => array(
             'PostsTag.post_id = Post.id'
        )
    )
);
$options['group'] = array('Tag.name');
$options['order'] = array('Tag.name ASC');
$options['limit'] = 20;

$this->Tag->recursive = -1;

$data = $this->Tag->find('all', $options);

2 个答案:

答案 0 :(得分:0)

我建议加入:http://book.cakephp.org/view/1047/Joining-tables

Cake中的HABTM查询并不是最简单的事情 - 但将递归设置为-1并执行JOIN是我找到的最好/最简单的解决方案。

基本上,一旦您习惯containablejoins,就可以set recursive to -1 in your AppModel,只需选择可包含或加入,具体取决于您想要的数据以及查询方式

答案 1 :(得分:0)

我不想在这里重复代码,所以请看一下这个插件。它正是你试图接近的。 https://github.com/CakeDC/tags/tree/2.0更具体地看一下这种方法:https://github.com/CakeDC/tags/blob/2.0/Model/tagged.php#L52复制代码(并在docblock中提供信用)或只是使用插件。