CakePHP3で数値検索をする方法

CakePHP3で数値検索をする方法

134 回閲覧されました

みなさんこんにちは、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にしてはいけません。