2015年8月13日木曜日

【cakePHP】半角・全角・カタカナ・ひらがななどの混じった文字列でのあいまい検索

cakePHPで、データベースからの検索をする場合。
キーワード入力欄などで、いい加減な入力にも柔軟に対応したいという要望がある場合。

MySQLの機能をうまく使うと、以下の曖昧入力での検索が簡単にできるようになる。
■アルファベットが、半角/全角、大文字/小文字にかかわらず、検索可能
■数字が、半角/全角にかかわらず、検索可能
■平仮名、カタカナ、半角カナにかかわらず、検索可能


参考URL:
http://tutty.info/527
http://qiita.com/kazu56/items/108075fcb5e98c0d637a
https://www.softel.co.jp/blogs/tech/archives/1877


要点:
■「collate utf8_unicode_ci like」を使う
    select * from item where item_name collate utf8_unicode_ci like '%りんご%';

■cakePHPの場合、テーブル名やコラム名にバッククオーテーションがつくので、カッコで囲む。
    $this->find('all',[
        'conditions'=>['(name) collate utf8_unicode_ci like'=>'%hoge%'
    ]);

■データベースがUTF8でない場合はもう一段階変換を挟む。「convert(コラム名 using utf8)」という書式。

    select * from member where convert(namae using utf8) collate utf8_unicode_ci like '%サトウ%';



現在の案件だと、データベースの文字コードがUTF8ではなかったので、以下のような感じになった。

コントローラーにおける記述:
---------------------------------------------------
//検索結果
$items = array();
if(empty($this->request->data) == false){
    //検索条件のセット
    $condition = array();

    //会員名あいまい検索
    $condition['and'][] = array('(convert(Member.name using utf8)) collate utf8_unicode_ci like'=>'%'.$this->request->data['Member']['name'].'%');

    //~ここにさらに検索条件を追加する処理~

    //ページネイターを使っての検索実行
    $items = $this->paginate('Member', $condition);
}//if
//検索結果をセット
$this->set("items", $items);
---------------------------------------------------


0 件のコメント:

コメントを投稿