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 件のコメント:
コメントを投稿