検索フォームに入力された複数の条件にマッチした結果を返す。

やりたいこと

ユーザーが検索フォームから、「検索したい文字列」と「対応済・未対応」を入力する。

画像1

検索文字と対応ステータス両方に合致するレコードを抽出する。

なお、検索文字は

・氏名(customer_name)
・メールアドレス(mail)
・本文(body)

のカラム内を検索して、部分一致すれば抽出するようにした。

ContactController

public function find() 
{
   $contacts = [];

   if ($this->request->is('post')) {

       / find.ctpのフォームから入力された検索条件を取り出す。
       $find = $this->request->data['find'];
       $flag = $this->request->data['flag'];

       $contacts = $this->paginate($this->Contacts->find()
       
       / mail,body,customer_nameのうち、どれかに$findの文字列が入っていれば
       / レコードを取り出す
       ->where(['mail like' => '%' . $find . '%'])
       ->orwhere(['body like' => '%' . $find . '%'])
       ->orwhere(['customer_name like' => '%' . $find . '%'])
       
       / さらにflagがフォームに入力された値と同じレコードを探す。
       ->where(['flag' => $flag])
       );
       
   }
       $this->set('msg', null);
           $this->set('contacts', $contacts);
   
}
->where(['mail like' => '%' . $find . '%'])
->orwhere(['body like' => '%' . $find . '%'])
->orwhere(['customer_name like' => '%' . $find . '%'])

こう書くと、mail,body,customer_nameのどれかに検索文字がヒットすればレコードを抽出してくれる。

そして、この後に

->where(['flag' => $flag])

を追加すると、抽出したレコードの中から、入力された対応ステータスに合致するレコードを抽出してくれる。(絞り込みみたいなこと)

これで、検索文字が含まれており、なおかつflagが今回選んだものと合致するレコードだけが表示される。

例:検索文字「やまうち」、対応ステータス「対応済」で検索した場合

お問い合わせ一覧

画像3

検索結果

画像2

find.ctp

<?= $this->Form->create() ?>
<fieldset>

   / inputされた検索文字をfindに入れてコントローラに送る。
   <?= $this->Form->input('find'); ?>
   
   / プルダウンで未対応か対応済か選択。未対応なら1、
   / 対応済なら2をflagに入れてコントローラに送る
   <?= $this->Form->control('flag', [
           'options' => [CONTENTS__FLAG__NOT_YET => '未対応', CONTENTS__FLAG__DONE => '対応済'],
           'label' => '',
           ]) ?>
   <?= $this->Form->button('Submit') ?>
   <?= $this->Form->end() ?>
</fieldset>





この記事が気に入ったらサポートをしてみませんか?