CakePHPで複数語句のlike検索を行う

2010/12/11 追記への指摘があったので修正
よく見たらできないとかできるとか嘘ついてました。
http://d.hatena.ne.jp/tenkoma/20101211
丁寧に検証までしてくれた方がいました。ありがとうございます。

=====
CakePHP1.2系でLike検索をする際に、
正気とは思えないけどよく見るとああなるほどという方法で実現できたのでメモしておきます。

CakePHPのlikeを利用する際に複数の語句を入力すると、
最後に代入した値で検索がされてしまいます。
指定したカラムの配列キーが最後に代入した値で上書きされてしまうので、
じゃあ、同じキーにしなきゃいいじゃんということでやってみたらうまくできました。

/*
実現した方法
Column1とlikeの間に半角スペースをいれて同キーになるのを回避する
*/
$search = array("and"=>
    "Column1 like" => "keyword1",
    "Column1  like" => "keyword2",
    "Column1   like" => "keyword3",
);
$datas = $this->findAll($search);

find関係のソースどうなってるんだろ。
実際に出力されているSQLを見るとlike keyword and like keyword2の形になっているので
データ量が増えればレスポンスがやばいことになりそうな気がする。

できなかったやり方も一応のせておきます。

// できそうでできないその1
$search = array("and"=>
    array("Column1 like ?" =>array("keyword1","keyword2"))
);

指摘箇所
できないとか嘘ついてました。ごめんなさい。
できそうでできないその2できそうでできなきゃこまるその2

$keys[0] =  array("Column1 like" => $keyword1);
$keys[1] =  array("Column1 like" => $keyword2);
$search = array("and"=>$keys);


2010/11/22 追記(できない!!)
よくよく考えたらコレでよかった
$search = array(“and”=>
“Column1 like” => “%keyword1%”,
“Column1 like” => “%keyword2%”
);
$this->hogehoge->find(‘all’,array(‘conditions’ => $search));



4 thoughts on “CakePHPで複数語句のlike検索を行う

  1. […] このページもまとまりがないですが似たような結論のようです。 CakePHPで複数語句のlike検索を行う […]

  2. [cakephp]Re: CakePHPで複数語句のlike検索を行う

    一応検証してみたのでメモ リンク先の記事の方法でうまくいく/うまくいかない理由がわからなかったので。 SQL データ構造+サンプルデータ CREATE TABLE IF NOT EXISTS `posts` ( `id` int(11) NOT NULL A…

  3. 完全に同じソースコードで試したわけではありませんが、追記の方法だと上手くいかないと思うのですが。
    debug($search) してみて、「”Column1 like” => “%keyword1%”」の部分が抜け落ちたりしませんか?

    逆に、「できそうでできないその2」の方法なら
    上手く行きますし、追記で、配列の要素をさらにarray() で囲めば上手く行くと思うのですが…

    1. いやいや、お恥ずかしい。
      出来るとかできないとか嘘ついてたようです。
      検証までしていただいてありがとうございます。
      修正と検証の方にリンクはらせていただきました。

コメントを残す