CodeLab技術ブログ

プログラミング技術まとめ

[CakePHP3.x]複数カラムでLIKE検索したい

| 0件のコメント

複数カラムでLIKE検索したいという要望はよくあると思いますが、CakePHP3ではどうやるのか?

スポンサードリンク

わかりやすい方法

直感的にわかりやすい方法としては、検索キーをORでつなげる方法があります。

$this->Users->find()
->where([
  ['OR']=>[
    'first_name LIKE'=>"%{$keyword}%"
    'last_name LIKE'=>"%{$keyword}%"    
  ]
]);

ただ、これだと、”山田”ではヒットしますが、”山田太郎”と姓名つなげたキーワードではヒットしなくなってしまいます。
なんとかしてconcatでつなげたフィールド作りたいですね。

解決策

CakePHP2では、バーチャルフィールドを使ってつなげたフィールドを作って検索していましたが、CakePHP3ではありません。
どうするかというと、こうします。

$this->Users->find()
->where(function ($exp, $query) use ($keyword) {
                $concat = $query->func()->concat([
                    'IFNULL(last_name, "")' => 'identifier',
                    'IFNULL(first_name, "")' => 'identifier'
                ]);
                return $exp->like($concat, "%{$keyword}%");
            })

ぶっちゃけ、何をしているのかいまいちよくわからないですが、これで期待通りの動きをするはずです。
ただ、複数キーワードの場合どうしたらいいのか・・・。

スポンサードリンク
スポンサードリンク

コメントを残す