Engineer as a Lifestyle @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

Re: CakePHPで複数語句のlike検索を行う « Php « Prog « Laddy in

一応検証してみたのでメモ
リンク先の記事の方法でうまくいく/うまくいかない理由がわからなかったので。

SQL データ構造+サンプルデータ

CREATE TABLE IF NOT EXISTS `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `body` text NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- テーブルのデータをダンプしています `posts`
--

INSERT INTO `posts` (`id`, `body`, `created`, `modified`) VALUES
(1, 'ほげら\r\nぴよぴよ', '2010-11-18 01:50:37', '2010-11-18 01:50:40'),
(2, 'ほげほげ\r\nhoge\r\nfuga\r\npiyo', '2010-11-18 01:50:58', '2010-11-18 01:51:00');

うまくいく方法 id=2を取り出す (CakePHPで複数語句のlike検索を行う « Php « Prog « Laddy inの「できそうでできないその2」)

<?php
class HomeController extends AppController {
    var $uses = array(
        'Post',
    );

    function posts(){
        $keys[0] = array('body LIKE' => '%hoge%');
        $keys[1] = array('body LIKE' => '%ほげ%');

        $params = array(
            'conditions' => array(
                'and' => array(
                    $keys
                ),
            ),
        );
        $posts = $this->Post->find('all', $params);
        debug($posts);
    }
}

うまくいかない方法 (違う部分だけ抜粋) (CakePHPで複数語句のlike検索を行う « Php « Prog « Laddy in の「2010/11/22 追記」)

<?php
        $params = array(
            'conditions' => array(
                'and' => array(
                    "body like" => "%hoge%",
                    "body like" => "%ほげ%",
                ),
            ),
        );

「"body like" => "%hoge%",」が消えるので、id=1も取り出されてしまう

この結果が当然だと思っていますが…。