私はCakePHP(最新リリース)でタグ検索をコーディングしていますが、私が作成したソリューションは、CakePHPの他の部分がいかに簡単であるかに比べて複雑すぎるようです。うまくいけば、誰かが私を正しい方向に向けたり、現在の解決策を改善するのを手伝ってくれるでしょう。
私のアプリの各ユーザーは、php、objective-c、javascript、jqueryなどのタグで自分自身にタグを付けることができます。別のタイプのユーザーは、特定のタグを持つユーザーを検索できます。彼らは検索するかもしれません:php、objective-c、ios。一致するタグの数の順にユーザーの配列を返す必要があります。3つのタグすべてを持つユーザーが配列の上部に表示されます。
これがデータベースのサンプルと私のソリューションです。これを改善するための助けを本当に感謝します。
【データベース】
[解決]
//Search Array
//Format: array('objective-c', 'javascript', 'jquery', 'php')
$tag_array = explode(",", $this->request->data["User"]["search"]);
//Get Tag IDs - array([id] => [id])
//Format: array([1] => '1', [2] => '2', [4] => '4', [15] => '15')
$result_tag_ids = $this->User->TagsUser->Tag->find('list', array(
'conditions' => array(
"Tag.name" => $tag_array
),
'fields' => array('Tag.id')
));
//Get User IDs - array([id] => [id])
//Format: array([24] => '24', [24] => '24', [26] => 26, [27] => '27')
$result_user_ids = $this->User->TagsUser->find('list', array(
'conditions' => array(
"TagsUser.tag_id" => $result_tag_ids
),
'fields' => array('TagsUser.user_id')
));
//Remove Duplicate user ids and add a count of how many tags matched & sort the array in that order
//Format: array([26] => 1, [24] => 2, [27] => 3)
$counted_user_ids = array_count_values($result_user_ids);
asort($counted_user_ids);
//Get the keys (user_ids)
$list_user_ids = array_keys($counted_user_ids);
//Get these users in the order of the sorted array
$search_result = $this->User->find('all', array(
'conditions' => array(
"User.id" => $list_user_ids
),
'order' => 'FIELD(User.id,' . implode(" ,", $list_user_ids) . ')'
));