検索フォームに入力された複数の条件にマッチした結果を返す。
やりたいこと
ユーザーが検索フォームから、「検索したい文字列」と「対応済・未対応」を入力する。
検索文字と対応ステータス両方に合致するレコードを抽出する。
なお、検索文字は
・氏名(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が今回選んだものと合致するレコードだけが表示される。
例:検索文字「やまうち」、対応ステータス「対応済」で検索した場合
お問い合わせ一覧
検索結果
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>