我在CakePHP(最新版本)中編碼標記系統,但是我所做的解決方案似乎過於複雜,而CakePHP的其餘部分卻非常容易。希望有人能指出我正確的方向或幫助我改進我現有的解決方案。CakePHP查詢和JSON輸出 - 改進當前解決方案
我需要傳遞給我的看法數據格式(JSON):
[{label:'actionscript', count: 14}, {label:'php', count: 2} ... ]
現在我知道下面的SQL查詢給了我所需要的數據:
SELECT tags.name, count(*)
FROM tags
RIGHT JOIN tags_users
ON tags.id=tags_users.tag_id
GROUP BY name";
所以使用CakePHP找到方法我做:
$options = array();
$options['contain'] = '';
$options['recursive'] = -1;
$options['joins'][0]['table'] = 'tags_users';
$options['joins'][0]['type'] = 'RIGHT';
$options['joins'][0]['conditions'] = 'Tag.id = tags_users.tag_id';
$options['fields'] = array('name', 'COUNT(*) as tag_counter');
$options['group'] = 'Tag.name';
$options['order'] = 'tag_counter DESC';
$availableTagsArray = $this->User->TagsUser->Tag->find('all', $options);
這給我一個數組出爲:
Array
(
[0] => Array
(
[Tag] => Array
(
[name] => actionscript
)
[0] => Array
(
[tag_counter] => 14
)
)
[1] => Array
(
[Tag] => Array
(
[name] => php
)
[0] => Array
(
[tag_counter] => 2
)
)
)
然後我通過這個數組轉換成JSON:
$availableTags = "[";
foreach ($availableTagsArray as $tag) {
$availableTags .= "{label:'{$tag['Tag']['name']}', count:{$tag[0]['tag_counter']}},";
}
$availableTags = substr($availableTags, 0, -1);
$availableTags .= "]";
$this->set("availableTags", $availableTags);
[更新]
做了很多的研究和使用兩個答案後。我發現有多種方法可以做到這一點,包括我的原始解決方案。您也可以使用虛擬字段,然後使用afterFind方法,並在那裏展平結果。