0

私は CakePHP (最新リリース) でタグ付けシステムをコーディングしていますが、私が作成したソリューションは、CakePHP の残りの部分がどれほど簡単であるかに比べて複雑すぎるようです。うまくいけば、誰かが私を正しい方向に向けるか、現在のソリューションを改善するのを手伝ってくれるでしょう.

ビュー データに次の形式 (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のfindメソッドを使って:

$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 メソッドを使用し、そこで結果を平坦化することもできます。

4

2 に答える 2

1

配列から JSON 文字列を手動で出力するために、独自のループを記述する必要はありません。PHP には、配列を JSON としてエンコードする関数が既にあります。

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

JSON が適切にラベル付けされるように、配列に正しいキーがあることを確認する必要があります。


また、モデルの関連付けを適切に設定することをおcontainable読みください。そうすれば、通常は面倒で複雑な結合を手動で指定することなく、検索オプション内の動作を使用してタグを取得できます。

于 2012-10-17T16:03:23.873 に答える
1

Containable Behaviorを使用してクエリを簡素化し、JSON ビューを使用して出力を簡素化できます。

于 2012-10-17T16:04:50.520 に答える