我正在为我的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);
答案 0 :(得分:0)
我建议加入:http://book.cakephp.org/view/1047/Joining-tables
Cake中的HABTM查询并不是最简单的事情 - 但将递归设置为-1并执行JOIN是我找到的最好/最简单的解决方案。
基本上,一旦您习惯containable
和joins
,就可以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中提供信用)或只是使用插件。