CakePHP3で数値検索をする方法
88 回閲覧されました
みなさんこんにちは、jonioです。
今回は数値で検索する方法のメモの記事になります。
おすすめ参考書
CakePHP3はまだまだ仕事で使われます。
下記の参考書がおすすめです。
リンク
CakePHPのバージョン
3.6です。
状況
例えばユーザー一覧ページでidカラムの値と名前が並んでいたとします。
idの値で検索をする時を考えます。
テンプレート
コードを下記にします。
<?= $this->Form->create(null, ['type' => 'get', 'url' => ['action' => 'index']]) ?>
<div>
<?= $this->Form->radio('search_type', [
['value' => 'id', 'text' => 'ユーザー番号'],
]) ?>
<?= $this->Form->button('検索', ['type' => 'submit']) ?>
</div>
<?= $this->Form->end() ?>
コントローラー
コードを下記にします。
$users = $this->Users->find();
$searchType = $this->getRequest()->getQuery('search_type');
$keyword = $this->getRequest()->getQuery('keyword');
if (!empty($keyword)) {
if ($searchType == id) {
$users->where(function ($exp, $q) use ($keyword) {
return $exp->like($q->newExpr()->add('CAST(Users.id AS CHAR)'), '%' . $keyword . '%');
}
}
}
$users = $this->paginate($users);
8行目〜10行目がポイントです。
8行目の「function ($exp, $q)」は9行目に使います。
「use ($keyword)」はif文の外にある(スコープ外)の$keywordをif文の中で使う為に記述しています。
9行目の「$exp->like()」でSQLのLIKE句を作成します。
CakePHPの中では元々SQLが使えないのですが「$q->newExpr()->add()」で使えるようにします。
CASTで型の変換をします。
理由は検索フォームに入力した数値は文字として認識される為です。
CHARはデータ型です、入力する数字は1とか2とか固定した値なのでVARCHARにしてはいけません。