質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

4109閲覧

cakephp3、FriendsOfCake/Searchプラグインで、スペース区切り複数語によるLike検索を実装したい

maifukuhara

総合スコア83

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/03/16 12:07

FriendsOfCakeのSearchプラグインを用いて
「名前+名前カナ+住所+住所カナ」でCONCATしたカラムに対して、
スペース区切りの複数語で、Like検索したいと思っています。
イメージ説明

こちらのURLを参考にコードを書き、
スペース区切りキーワードの個数を3つに指定し
検索するところまでは出来たのですが、
キーワードの個数を任意にする方法がわかりません。

具体的にはLike記述のメソッドチェーンを
配列の個数だけ出力するような記述にしたいのですが、
アロー演算子の中でループを書くとエラーになってしまいます。

アドバイスをいただければ幸いです。
どうぞよろしくおねがいします。

//-------------------------------------
(コードから問題の個所を抜粋)
※モデルのサーチプラグイン設定、最後の部分です。
この部分の記述を、配列の中身が何個でも対応できるようにしたいです
return $exp
->like($concatstring, '%' . $arrKwd[0] . '%')
->like($concatstring, '%' . $arrKwd[1] . '%')
->like($concatstring, '%' . $arrKwd[2] . '%');
//-----------------------------------

php

1//■■■ モデル(テーブル ) 2//■■■ app\src\Model\Table\CustomersTable.php 3namespace App\Model\Table; 4use Cake\ORM\Query; 5use Cake\ORM\RulesChecker; 6use Cake\ORM\Table; 7use Cake\Validation\Validator; 8use Search\Manager; 9class CustomersTable extends Table 10{ 11 12 public function initialize(array $config) 13 { 14 parent::initialize($config); 15 $this->table('customers'); 16 $this->displayField('name'); 17 $this->primaryKey('id'); 18 $this->addBehavior('Timestamp'); 19 20 /*▼サーチプラグイン設定 */ 21 $this->addBehavior('Search.Search'); 22 $this->searchManager() 23 ->add('name', 'Search.Like', [ 24 'before' => true, 25 'after' => true, 26 'multiValue ' => true, 27 'fieldMode' => 'OR', 28 'valueMode' => 'AND', 29 'comparison' => 'LIKE', 30 'wildcardAny' => '*', 31 'wildcardOne' => '?', 32 'field' => ['Customers.name','Customers.name_kana'] 33 ]) 34 ->add('address', 'Search.Like', [ 35 'before' => true, 36 'after' => true, 37 'fieldMode' => 'OR', 38 'valueMode' => 'AND', 39 'comparison' => 'LIKE', 40 'wildcardAny' => '*', 41 'wildcardOne' => '?', 42 'field' => ['address_1','address_1_kana'] 43 ]) 44 ->add('phone', 'Search.Like', [ 45 'before' => true, 46 'after' => true, 47 'fieldMode' => 'OR', 48 'valueMode' => 'OR', 49 'comparison' => 'LIKE', 50 'wildcardAny' => '*', 51 'wildcardOne' => '?', 52 'field' => ['phone_1','phone_2'] 53 ]) 54 55 //■ここから名前・住所キーワード検索用 56 ->add('kwd', 'Search.Callback', [ 57 'callback' => function ($query, $args, $manager) { 58 59 //取得クエリの文字列を整形し、キーワード配列に変換 60 $strKwd = $args['kwd']; 61 $strKwd = mb_convert_kana($strKwd, 's'); 62 $strKwd = preg_replace('/\s(?=\s)/', '', $strKwd); 63 $arrKwd = explode(" ", $strKwd ); 64 65 //キーワード欄へのインプットが「港区台場 山田 タロウ」の場合 66 // $arrKwd = array("港区台場","山田","タロウ")になる 67 debug($arrKwd); 68 69 //クエリを作成 70 return $query 71 ->where(function ($exp, $query) use ($arrKwd) { 72 73 //名前、名前カナ、住所、住所カナをconcat 74 $concatstring = $query->func()->concat([ 75 'customers.name' => 'identifier', 76 'customers.name_kana' => 'identifier', 77 'customers.address_1' => 'identifier', 78 'customers.address_1_kana' => 'identifier' 79 ]); 80 81 //配列化したキーワードAnd条件でLike検索する 82 "★悩み★この部分の記述をループ化し、配列が何個でも対応できるようにしたいです" 83 return $exp->like($concatstring, '%' . $arrKwd[0] . '%') 84 ->like($concatstring, '%' . $arrKwd[1] . '%') 85 ->like($concatstring, '%' . $arrKwd[2] . '%'); 86 }); 87 } 88 ]); 89 /*▲サーチプラグイン設定 */ 90 91 //以下略 92} 93 94 95発行したいSQLのイメージはこんな感じです。 96SELECT * 97FROM customers Customers 98WHERE 99 ( 100 ( 101 CONCAT( 102 (customers.name), 103 (customers.name_kana), 104 (customers.address_1), 105 (customers.address_1_kana) 106 ) 107 ) LIKE '%港区台場%' 108 AND ( 109 CONCAT( 110 (customers.name), 111 (customers.name_kana), 112 (customers.address_1), 113 (customers.address_1_kana) 114 ) 115 ) LIKE '%山田%' 116 AND ( 117 CONCAT( 118 (customers.name), 119 (customers.name_kana), 120 (customers.address_1), 121 (customers.address_1_kana) 122 ) 123 ) LIKE '%タロウ%' 124 ) 125 126 127 128 129 130//■■■ ビュー 131//■■■ app\src\Template\Customers\index.php 132<?= $this->Form->create(); ?> 133 134 //↓追加実装したい複数キーワードのインプット 135 <?= $this->Form->input('kwd', [ 'label'=>"名前・住所キーワード検索", 'placeholede'=>'港区台場 山田 タロウ']); ?> 136 137 <?= $this->Form->input('name', [ 'label'=>"名前"]); ?> 138 139 <?= $this->Form->input('address', [ 'label'=>"地域・住所"]); ?> 140 141 <?= $this->Form->input('phone', [ 'label'=>"電話・携帯"]); ?> 142 143 //以下略 144 145<?= $this->Form->end(); ?> 146 147 148 149 150//■■■ コントローラ 151//■■■ app\src\Controller\CustomersController.php 152namespace App\Controller; 153use App\Controller\AppController; 154class CustomersController extends AppController 155{ 156 public function initialize() 157 { 158 parent::initialize(); 159 $this->loadComponent('Search.Prg'); 160 } 161 162 public function index() 163 { 164 165 //■検索サーチプラグイン利用 166 $selected = $this->Customers 167 ->find('search', ['search' => $this->request->query]) 168 ->contain(['Regions', 'Staffs']); 169 $this->set('customers', $this->paginate($selected,['limit'=>'50'])); 170 171 //以下略 172}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

foreach等でループして必要な分だけlikeを実行すればできると思いますよ

php

1 //配列化したキーワードAnd条件でLike検索する 2 foreach($arrKwd as $kwd) { 3 $exp->like($concatstring, '%' . $kwd . '%'); 4 } 5 return $exp;

投稿2017/03/17 13:26

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maifukuhara

2017/03/17 14:04

あ、なるほど。 よく考えたらアロー演算子は”メソッド”を呼ぶのでしたね。。。。 勉強不足、お恥ずかしいです。 バッチリ動きました。いつもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問