2015年12月16日水曜日

CakePHP 3で、ちょっと複雑なLIKE文検索

CakePHP 3で、ちょっと複雑なLIKE文検索です。更に複雑な検索を実現したい場合は、プラグインを利用したほうが良いのかもしれません。

src/Controller/ArticlesController.php
// $arrayWordは、検索キーワードの配列
// $arrayWord = array('あ','い','う') ;
$query = $this->Articles->find()
  ->where(function ($exp, $q) use ($arrayWord) {
    if (is_array($arrayWord) && count($arrayWord) > 0) {
      foreach ($arrayWord as $key => $value) {
        $exp->like('title', '%'.$value.'%');
      }
    }
    return $exp;
  })
  ->orWhere(function ($exp, $q) use ($arrayWord) {
    if (is_array($arrayWord) && count($arrayWord) > 0) {
      foreach ($arrayWord as $key => $value) {
        $exp->like('body', '%'.$value.'%');
      }
    }
    return $exp;
  })
  ->andWhere(function ($exp, $q) {
    return $exp->gt('created', '2015-01-01');
  });

// 検索条件を保ったままページ送り
$articles = $this->paginate($query);

実際に発行されるSQL文
SELECT 
  Articles.id AS `Articles__id`, 
  Articles.title AS `Articles__title`, 
  Articles.body AS `Articles__body`, 
  Articles.created AS `Articles__created`, 
  Articles.modified AS `Articles__modified` 
FROM 
  articles Articles 
WHERE 
  (
    created > '2015-01-01' 
    AND (
      (
        body LIKE '%あ%' 
        AND body LIKE '%い%' 
        AND body LIKE '%う%'
      ) 
      OR (
        title LIKE '%あ%' 
        AND title LIKE '%い%' 
        AND title LIKE '%う%'
      )
    )
  ) 
ORDER BY 
  Articles.created desc 
LIMIT 
  10 OFFSET 20

実際に設定してみたサイトがこちら

参考サイト
Query Builder (CakePHP Cookbook 3.x documentation)

0 件のコメント:

コメントを投稿