2012-10-17 43 views
0

我在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方法,並在那裏展平結果。

回答

1

您不需要編寫自己的循環來手動輸出數組中的JSON字符串。 PHP已經有一個函數來編碼數組作爲JSON:

http://php.net/manual/en/function.json-encode.php

你只需要確保該陣列將在具有正確的鍵,以便將JSON被正確標記。


而且讀入setting up your model associations properly,那麼你可以使用你的查找選項中containable行爲來獲取代碼,而無需手動指定連接,這通常是混亂和複雜。